![](/img/trans.png)
[英]Use templated object within a templated class with different sets of template parameters
[英]Use templated class without template
我有這樣的課:
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);
}
有沒有更好的方法可以做到這一點? 我可以考慮基類並通過引用傳遞,但是它變得太復雜而無法正確。
(這不是實際代碼,如果存在語法錯誤,請不要關注。)
我會使用包裝方法...
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;
}
我看不到為什么需要調用函數來避免使用模板。 似乎是任意的,不必要的限制。
只需提供一個輔助函數並從模板化類型進行轉換即可。
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。
關於使用typedef呢? 我的意思是,您可以為函數使用下一個簽名: void process(const Buffer<1024>& b);
但由於模板參數聲明,它不太適合。 如果將值更改為其他值,則還必須更改簽名。 為了避免這種情況,請嘗試使用typedef。 像這樣
typedef Buffer<1024> TBuffer;
void process(const TBuffer& buffer);
int main(){
TBuffer b;
process(b);
}
如果在這種情況下更改模板值,則無需更改其余代碼。
如果您不使用模板的理由是不想將非Buffer
傳遞給該函數,那么讓我告訴您這不是問題。 您可以將模板參數僅用於如下尺寸
template<size_t MAX_SIZE>
void process(Buffer<MAX_SIZE>& buffer)
{
//do stuff here
}
現在,您只能將Buffer
傳遞給process
。 您可以傳遞任何大小的Buffer
但只會使用Buffer
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.