我正在尝试将全局缓冲区大小替换为可以为测试修改的缓冲区大小。当前代码如下:
static const uint32_t BUFFER_SIZE = 1 << 8;
class BufferWrapper {
.
.
.
char buffer_[BUFFER_SIZE];
};
当我尝试更改BUFFER_SIZE进行测试时,这会导致问题。因此,我希望将BUFFER_SIZE设为模板常量,并为该常量设置一个默认值,以便只在测试期间指定它,例如:
static const uint32_t BUFFER_SIZE = 1 << 8;
template <uint_32 SIZE = BUFFER_SIZE>
class BufferWrapper {
.
.
.
char buffer_[SIZE];
};
这样,以前的声明仍然可以像这样编译:
BufferWrapper buf
但是在测试期间,我可以编写如下代码来测试1KB的缓冲区:
BufferWrapper<1024> test_buf;
我的问题是,是否可以为模板值提供默认值,我该怎么做?当我声明类似BufferWrapper buf;
时,上面的错误是:
error: use of class template 'BufferWrapper' requires template arguments; argument deduction not allowed in function prototype
答案 0 :(得分:4)
正如this answer所述,自C ++ 17起,代码就可以了。但是,如果您无权访问,则仍然可以避免更改所有现有代码以使用BufferWrapper<>
而不是BufferWrapper
的需求。
通过将BufferWrapper
重命名为其他名称(例如BufferWrapperTemplate
)并为默认大小的版本提供类型别名来完成此操作:
template <uint_32 SIZE = BUFFER_SIZE>
class BufferWrapperTemplate {
.
.
.
char buffer_[SIZE];
};
typedef BufferWrapperTemplate<> BufferWrapper;
这样,所有现有代码都可以继续使用BufferWrapper
,并且测试可以在需要的地方使用BufferWrapperTemplate<42>
。
答案 1 :(得分:3)
在C ++ 17中显示的程序没有问题。
在C ++ 17之前,您必须提供模板参数列表,即使它为空:
BufferWrapper<> test_buf;
在这种情况下,您可以避免使用类型别名来更改客户端代码:
template <uint_32 SIZE = BUFFER_SIZE>
class BufferWrapperTemplate;
using BufferWrapper = BufferWrapperTemplate<>;