我有这样的课程:
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);
}
还有更好的方法吗?我可以考虑基类,并通过引用传递,但它太复杂而不正确。
(这不是实际代码,如果存在语法错误,请不要注意。)
答案 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
秒。