C 中模板常数的默认值
Default value for template constant in C++
我正在尝试将全局缓冲区大小替换为可以修改测试的大小。当前代码类似于:
static const uint32_t BUFFER_SIZE = 1 << 8;
class BufferWrapper {
.
.
.
char buffer_[BUFFER_SIZE];
};
当我尝试更改测试的Buffer_Size时,这会导致问题。因此,我希望使buffer_size 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
正如此答案所述,由于C 17,代码很好。但是,如果您无法访问此操作,您仍然可以解决更改所有现有代码以使用BufferWrapper<>
而不是BufferWrapper
。
通过将BufferWrapper
重命名为其他(例如BufferWrapperTemplate
(并为默认尺寸版本提供类型别名来执行此操作:
template <uint_32 SIZE = BUFFER_SIZE>
class BufferWrapperTemplate {
.
.
.
char buffer_[SIZE];
};
typedef BufferWrapperTemplate<> BufferWrapper;
以这种方式,所有现有代码都可以继续使用BufferWrapper
,并且测试可以在需要时使用BufferWrapperTemplate<42>
。
C 17中的显示程序没有问题。
在C 17之前,您也必须提供模板参数列表,即使它为空:
BufferWrapper<> test_buf;
在这种情况下,您可以避免使用类型别名更改客户端代码:
template <uint_32 SIZE = BUFFER_SIZE>
class BufferWrapperTemplate;
using BufferWrapper = BufferWrapperTemplate<>;
相关文章:
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 具有默认值的引用获取函数
- 当给定默认值时,为什么此模板参数推导失败
- 从具有默认值的部分指定模板类继承时发生SWIG错误,具有不带默认值的正向声明
- 格式化浮点值:返回默认值
- 如何将数组部分初始化为某个默认值?
- asn1c 不会从 asn.1 模块中提取八位字节字符串的默认值
- 创建一个包含 c++ 默认值的环境文件
- C++(和 ROS) - 包含与前向声明引用,设置默认值和类型定义
- Makefile g++ 使用命令行中的 -D 变量进行编译,默认值
- Switch 语句(字符串)一直选择默认值,除非其为零
- 如何使用默认值将枚举声明为 extern
- 如何在提升程序选项中设置矢量<矢量>的默认值<string>
- 如何使用默认值为构造函数中的枚举赋值?
- 变量始终在函数中重置为默认值
- 如何在C++中提供模板化函数作为另一个函数的参数,默认值?
- 函数不返回默认值
- 具有公共范围与专用范围的默认值的C++的不同行为
- 在 c++ 中,如果我创建一个接受一个具有默认值的参数的构造函数 - 它会用作默认(空)构造函数吗?
- C 中模板常数的默认值