C ++中模板常量的默认值

时间:2019-06-24 15:11:30

标签: c++ templates

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

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

2 个答案:

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