【发布时间】:2018-11-30 10:52:27
【问题描述】:
使用扩展的嵌入式 Cpp。如何在发布版本中导致编译错误:
Param okParam("Yeah!"); // this line should be ok
Param nOkParam("REEEEEEEEEEE"); // too big array, not ok. compiler error.
地点:
int const c_max = 10;
template<int N>
struct Param
{
char value[c_max];
Param(char const (&p_value)[N])
{
memcpy(value, p_value, sizeof(p_value));
}
};
我不认为你可以对构造函数进行模板化,所以需要对整个结构进行模板化,对吗?
我希望它提供一个干净的编译器错误,以便使用它的人会立即注意到它。
我们的扩展嵌入式 C++ 版本不提供任何 stl 容器,我不确定它是否可能。
我正在寻找使模板产生良好编译错误的方法。遗憾的是我也不能使用 boost,因为平台不支持它。
【问题讨论】:
-
你可以用 N 模板化 cosntructor,然后你可以使用 static_assert。
-
我会仔细检查我没有静态断言,但我认为这个编译器不支持它。
-
char value[c_max];无效,c_max需要是编译时间常数。此外,如果您的编译器不支持static_assert,那么它可以相对容易地手动实现。见BOOST_STATIC_ASSERT -
@VTT
int const c_max = 10;是一个常量表达式。 -
@liliscent 问题已编辑,原始版本使用非静态成员字段来保存数组大小。