C++ C+中模板常量的默认值+;
我正在尝试将全局缓冲区大小替换为一个可以为测试修改的大小。当前代码类似于:C++ C+中模板常量的默认值+;,c++,templates,C++,Templates,我正在尝试将全局缓冲区大小替换为一个可以为测试修改的大小。当前代码类似于: static const uint32_t BUFFER_SIZE = 1 << 8; class BufferWrapper { . . . char buffer_[BUFFER_SIZE]; }; static const uint32_t BUFFER_SIZE = 1 << 8; template <uint_32 SIZE = BUFFER_SIZE> class
static const uint32_t BUFFER_SIZE = 1 << 8;
class BufferWrapper {
.
.
.
char buffer_[BUFFER_SIZE];
};
static const uint32_t BUFFER_SIZE = 1 << 8;
template <uint_32 SIZE = BUFFER_SIZE>
class BufferWrapper {
.
.
.
char buffer_[SIZE];
};
但在测试过程中,我可以编写如下内容来测试1KB的缓冲区:
BufferWrapper<1024> test_buf;
C++17中显示的程序没有问题 在C++17之前,即使模板参数列表为空,也必须提供该列表:
BufferWrapper<> test_buf;
BufferWrapper测试;
在这种情况下,可以通过使用类型别名避免更改客户端代码:
template <uint_32 SIZE = BUFFER_SIZE>
class BufferWrapperTemplate;
using BufferWrapper = BufferWrapperTemplate<>;
模板
类缓冲包装器模板;
使用BufferWrapper=BufferWrapperTemplate;
如前所述,从C++17开始,代码就很好了。但是,如果您没有访问权限,您仍然可以绕过将所有现有代码更改为使用BufferWrapper
而不是BufferWrapper
的需要
为此,请将BufferWrapper
重命名为其他名称(例如BufferWrapperTemplate
),并为默认大小的版本提供类型别名:
template <uint_32 SIZE = BUFFER_SIZE>
class BufferWrapperTemplate {
.
.
.
char buffer_[SIZE];
};
typedef BufferWrapperTemplate<> BufferWrapper;
模板
类缓冲包装器模板{
.
.
.
字符缓冲区[SIZE];
};
typedef BufferWrapper模板BufferWrapper;
这样,所有现有代码都可以继续使用
BufferWrapper
,测试可以在需要时使用BufferWrapperTemplate
。也许您使用的是一个旧编译器,不支持变量的模板参数推断?您是否尝试过BufferWrapper测试代码>?错误提示代码与此处显示的代码不完全相同。您可以共享一个吗?问题是缓冲区大小必须在编译时知道,但我只能使用静态常量来定义大小。删除常量限定符会引发错误。缓冲区大小为uint32\t
,而模板参数为uint\u 32
,您可能需要相同的拼写。另外,在更改之后,您需要在c++17之前的编译器上说BufferWrapper
(带尖括号)buffer以获得默认值。您可能会考虑像STL那样做,并将您的Buffer-Wrror定义为BasicBufferWrapper,然后使用Buffer-WrrPuls= Basic Buffer-WrrPrase<代码>;代码>因此现有代码不需要更改。那么您不需要默认值,只需在这里传递它。或者调用它BufferWrapperImpl
,然后使用BufferWrapper=BufferWrapperImpl
提供。这就是我要做的。嘿,是的,就像那样。我明白了,是的,我不使用C++17。谢谢你的帮助typedef BufferWrapper BufferWrapper Template
我认为这些标识符是向后的。@eerorika谢谢,修复了。@Jarod42当然,但如果我写的东西是针对旧编译器的一种解决方法,那么最好还是使用旧语法。
template <uint_32 SIZE = BUFFER_SIZE>
class BufferWrapperTemplate;
using BufferWrapper = BufferWrapperTemplate<>;
template <uint_32 SIZE = BUFFER_SIZE>
class BufferWrapperTemplate {
.
.
.
char buffer_[SIZE];
};
typedef BufferWrapperTemplate<> BufferWrapper;