簡體   English   中英

使用沒有模板的模板化類

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM