我有这个功能实现零覆盖的东西,它使用static_assert来检查,如果给定的事情的类型是POD类型:如何设置一个static_assert的评估前提条件?
template <bool safeMode = true, typename generic>
void overwriteWithZeros(generic *variableAddress)
{
if (safeMode) static_assert(std::is_pod<generic>::value, "Only POD types can be properly overwriten");
const size_t size = sizeof(generic);
unsigned char *variableData = (unsigned char*)(variableAddress);
for (size_t i = 0; i < size; i++)
variableData[i] = 0;
}
我称之为这里:
int main()
{
being *creature = new being(100, "a guinea pig"); // being is not a POD type
overwriteWithZeros<false>(creature);
// totally unrelated stuff...
}
而且由于safeMode
是编译时间值,我不知道它为什么会发生这种情况是真的还是假的,static_assert总是“发生”,给我不是POD类型的预期错误,就好像在static_assert之前的if
简单地wasn在那里。
那么,我在这里做错了什么?
既然你证实了我的怀疑(if
本身在运行时尽管safeMode
是一个编译时的值或者不评估,而static_assert
是在编译时计算的),我改变了主要问题:
什么我能做些什么来实现我在这里尝试的吗?
因为'if'在运行时被评估,'static_assert'在编译时被评估。 –
*“我能做些什么来实现我在这里尝试的功能”* - 'static_assert'不需要任何费用。删除'safeMode'参数并无条件保留断言。 –
我可以做到这一点,但我想要一个开关来启用类型的安全检查,所以如果你真的想覆盖一些不是POD的东西,你可以这样做,并采取后果。 –