我正在尝试将全局缓冲区大小替换为可修改以进行测试的缓冲区大小。当前的代码类似于:
static const uint32_t BUFFER_SIZE = 1 << 8;
class BufferWrapper {
.
.
.
char buffer_[BUFFER_SIZE];
};
Run Code Online (Sandbox Code Playgroud)
当我尝试更改测试的 BUFFER_SIZE 时,这会导致问题。因此,我希望使 BUFFER_SIZE 成为模板常量,并为该常量设置一个默认值,以便我只需要在测试期间指定它,例如:
static const uint32_t BUFFER_SIZE = 1 << 8;
template <uint_32 SIZE = BUFFER_SIZE>
class BufferWrapper {
.
.
.
char buffer_[SIZE];
};
Run Code Online (Sandbox Code Playgroud)
这样,以前的声明仍然可以像这样编译:
BufferWrapper buf
Run Code Online (Sandbox Code Playgroud)
但在测试过程中,我可以编写类似这样的代码来测试 1KB 的缓冲区:
BufferWrapper<1024> test_buf;
Run Code Online (Sandbox Code Playgroud)
我的问题是,是否可以为模板值提供默认值,我该如何做?当我声明类似的内容时,我得到的错误BufferWrapper buf;是:
error: use of class template 'BufferWrapper' requires template arguments; argument deduction not allowed in function prototype
Run Code Online (Sandbox Code Playgroud)
正如这个答案所述,从 C++17 开始,代码就很好了。但是,如果您无权访问它,您仍然可以避免更改所有现有代码以BufferWrapper<>使用BufferWrapper.
通过重命名BufferWrapper为其他名称(例如BufferWrapperTemplate)并为默认大小的版本提供类型别名来实现此目的:
template <uint_32 SIZE = BUFFER_SIZE>
class BufferWrapperTemplate {
.
.
.
char buffer_[SIZE];
};
typedef BufferWrapperTemplate<> BufferWrapper;
Run Code Online (Sandbox Code Playgroud)
这样,所有现有代码都可以继续使用BufferWrapper,并且测试可以BufferWrapperTemplate<42>在需要的地方使用。
| 归档时间: |
|
| 查看次数: |
1171 次 |
| 最近记录: |