如果参数类型T错误,应该在以下函数中做什么?
template <class T>
constexpr inline size_t GetObjectSize(const T & val)
{
if constexpr (std::is_arithmetic<T>::value)
{
return sizeof(val);
}
if constexpr (std::is_class<T>)
{
return 5u;
}
//there should be compile time error.
}
int * p;
//compile time error
GetObjectSize(p);
可能的选择是1)引发异常2)assert 3)static_assert
1)我应该抛出哪种类型的异常?
2)它是实现定义的,不能保证是costexpr。
3)static_assert(false)总是独立于T而失败。
答案 0 :(得分:1)
static_assert(false)始终独立于T而失败。
然后使其依赖于T
。
template<typename>
struct always_false { enum {value = 0}; };
// ...
if constexpr(...) {
}
else {
static_assert(always_false<T>::value, "Some useful description");
}
是的,这是魔术师的把戏。但是法律草率的说法还是可以的。遗憾的是,实际上并没有更好的方法在if constexpr
的从属分支中打印有用的诊断。