C 中模板常数的默认值

Default value for template constant in C++

本文关键字:默认值 常数      更新时间:2023-10-16

我正在尝试将全局缓冲区大小替换为可以修改测试的大小。当前代码类似于:

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