昨天我读了几个答案static_assert(false, "Some message")
,关于 an 的内部else
子句的使用if constexpr
。我知道根据标准,它被认为是格式错误的(即使某些编译器,包括 MSVC2017 会接受它)。Qt 也会将此标记为错误。
我的问题是,下面的代码是否符合标准?(我倾向于这样认为,但我想确认一下。)
template <typename TypeOfValue>
static void PushValue(duk_context* ctx, TypeOfValue value) {
// Push value onto duktape stack
if constexpr (std::is_same<TypeOfValue, int>::value) {
// Push int
duk_push_int(ctx, value);
} else if constexpr (std::is_same<TypeOfValue, uint32_t>::value) {
// Push uint
duk_push_uint(ctx, value);
} else {
// Unsupported type
static_assert(bool_value<false, TypeOfValue>(), "Unsupported type");
}
}
template <bool value, typename T>
static constexpr bool bool_value() {return value;}
编辑:
从我得到的评论看来,bool_value应该像这样定义:
template<bool value, typename T>
struct bool_value {
static constexpr bool value = value;
};
使用模式
// Unsupported type
static_assert(bool_value<false, TypeOfValue>::value, "Unsupported type");
然后它是格式良好的,只是因为bool_value可以专门化为一个为表达式返回truebool_value<false, TypeOfValue>::value
的版本。