2016-04-01 59 views
1

使用模板類我有類是這樣的:沒有模板

template<size_t MAX_SIZE> 
struct Buffer{ 
    size_t size; 
    char data[MAX_SIZE]; // this must be inside the struct itself 
    constexpr static size_t max_size = MAX_SIZE; 
}; 

我需要能夠通過這個類的功能是不應該使用的模板,目前我在做這樣的事情:

void process(size_t &size, char *data, size_t max_size); 

int main(){ 
    Buffer<1024> b; 
    process(b.size, b.data, b.max_size); 
} 

有沒有更好的方法來做同樣的事情?我可以考慮基類,並通過引用傳遞,但它太複雜,無法正確。

(這是不實際的代碼,請如果有語法錯誤,不講究。)

+2

你可能想避免這個問題,但是:爲什麼過程不允許使用模板?它允許使用什麼,爲什麼? – IceFire

+0

很好的問題。理由對我來說不是100%明確的 - 直覺。冥想我會。認真 - 我想要process()的代碼在不同的.o文件中 – Nick

+0

你的直覺可能是你不想讓進程成爲模板。這需要更深入的思考:將MAX_SIZE作爲模板參數意味着它定義了類型。因此,流程必須成爲處理多種不同類型的模板。如果Buffer實際上只是一種類型,那麼MAX_SIZE不應該是模板參數。 – IceFire

回答

5

我會用一個包裝法...

template<size_t MAX_SIZE> 
void process(Buffer<MAX_SIZE>& buffer) 
{ 
    process(buffer.size, buffer.data, buffer.max_size); 
} 

...然後就調用...

int main() 
{ 
    Buffer<1024> buffy; 
    process(buffy); 
    return 0; 
} 
5

我不明白爲什麼需要調用函數來避免使用模板。這似乎是一個任意的不必要的限制。

只需提供輔助函數和模板類型的轉換即可。

struct Helper 
{ 
    size_t size; 
    size_t max_size; 
    char *data; 
}; 

template<size_t MAX_SIZE> 
struct Buffer 
{ 
    size_t size; 
    char data[MAX_SIZE]; // this must be inside the struct itself 

    constexpr static size_t max_size = MAX_SIZE; 

    operator struct Helper() {return Helper {size, max_size, &data[0]};}; // C++11 
    //  operator struct Helper() {Helper temp(size, max_size, &data[0]); return temp;}; // pre C++11 

}; 

void process(struct Helper); 

int main() 
{ 
    Buffer<1024> b; 
    process(b); // or process(Helper(b)) 
} 

只要你避開C++特定功能,該Helper型也能夠被傳遞給C.

0

如果你的理由不使用模板的是,你不希望有非Buffer小號傳遞給函數然後讓我告訴你,這不是一個問題。您可以使用模板參數只是大小有如

template<size_t MAX_SIZE> 
void process(Buffer<MAX_SIZE>& buffer) 
{ 
    //do stuff here 
} 

現在你只能通過一個Bufferprocess。您可以通過任何尺寸Buffer但它只會採取Buffer s。

Live Example

1

有關使用類型定義是什麼。我的意思是,您可以使用下一個簽名功能:void process(const Buffer<1024>& b);,但由於模板參數聲明,它不太適合。如果您將價值改變爲別的東西,您也必須更改簽名。爲了避免這種情況,請嘗試使用typedef。像這樣的東西

typedef Buffer<1024> TBuffer; 

void process(const TBuffer& buffer); 

int main(){ 
    TBuffer b; 
    process(b); 
} 

如果在這種情況下更改模板值,則不需要更改其餘代碼。