使用没有模板的模板化类

时间:2016-04-01 12:37:59

标签: c++ templates c++11

我有这样的课程:

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);
}

还有更好的方法吗?我可以考虑基类,并通过引用传递,但它太复杂而不正确。

(这不是实际代码,如果存在语法错误,请不要注意。)

4 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分: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.

答案 2 :(得分:1)

使用typedef怎么样?我的意思是,你可以为你的函数使用下一个签名:void process(const Buffer<1024>& b);但由于模板参数声明它不是很合适。如果将值更改为其他值,则还必须更改签名。为避免这种情况,请尝试使用typedef。像这样的东西

typedef Buffer<1024> TBuffer;

void process(const TBuffer& buffer);

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

如果在这种情况下更改模板值,则无需更改其余代码。

答案 3 :(得分:0)

如果您不使用模板的原因是您不希望将非Buffer传递给该函数,那么让我告诉您这不是问题。您可以将模板参数用于像

这样的大小
template<size_t MAX_SIZE>
void process(Buffer<MAX_SIZE>& buffer)
{
    //do stuff here
}

现在您只能将Buffer传递给process。您可以传递任何尺寸Buffer,但只需Buffer秒。

Live Example