调用 constexpr 函数的给定重载时触发编译时错误
Trigger compile time error when given overload of the constexpr function is called
我正在编写在编译时映射中执行查找的自定义可变参数模板。
问题是,每次在该映射中找不到该值时,我都想触发编译时错误 - 最好带有描述性错误消息。
示例代码:
template<key_t k, class pair, class... pairs>
static constexpr value_t get_local(std::tuple<pair, pairs...>)
{
return (pair::key == k) ? pair::value : get_local<k>(std::tuple<pairs...>{});
}
template<key_t k> static constexpr value_t get_local(std::tuple<>)
{
// Trigger error!
}
我可以在代码的第二部分保留 get_local
undefined,它实际上会触发链接器错误,但这不属于 "descriptive error message".
的类别
我认为静态断言在这里没有用。
我正在使用 C++ 17
直接解决方案是delete
过载:
template<key_t k> static constexpr value_t get_local(std::tuple<>) = delete;
这将提供有点的描述性消息,表明我们尝试使用不存在的基本案例。
或者,使用静态断言:
template<key_t k> struct always_false { static constexpr bool value = false; };
template<key_t k> static constexpr value_t get_local(std::tuple<>)
{
static_assert(always_false<k>::value, "Hit bad case!");
return std::declval<value_t>();
}
需要 always_false
实用程序来使断言条件依赖,因此模板不是格式错误的;不需要诊断,因为 static_assert(false, ...)
可以做到。
请注意,您在自己的条件运算符中自己实例化了此重载:
(pair::key == k) ? pair::value : get_local<k>(std::tuple<pairs...>{});
当您遇到具有单个元素的元组的情况时。条件表达式的两个 "branches" 都必须有效。最好用 if constepxr
:
有条件地处理它
if constexpr (pair::key == k) return pair::value;
else return get_local<k>(std::tuple<pairs...>{});
因为您确实指出 pair::key == k
可以在常量表达式中求值。
我正在编写在编译时映射中执行查找的自定义可变参数模板。
问题是,每次在该映射中找不到该值时,我都想触发编译时错误 - 最好带有描述性错误消息。
示例代码:
template<key_t k, class pair, class... pairs>
static constexpr value_t get_local(std::tuple<pair, pairs...>)
{
return (pair::key == k) ? pair::value : get_local<k>(std::tuple<pairs...>{});
}
template<key_t k> static constexpr value_t get_local(std::tuple<>)
{
// Trigger error!
}
我可以在代码的第二部分保留 get_local
undefined,它实际上会触发链接器错误,但这不属于 "descriptive error message".
我认为静态断言在这里没有用。
我正在使用 C++ 17
直接解决方案是delete
过载:
template<key_t k> static constexpr value_t get_local(std::tuple<>) = delete;
这将提供有点的描述性消息,表明我们尝试使用不存在的基本案例。
或者,使用静态断言:
template<key_t k> struct always_false { static constexpr bool value = false; };
template<key_t k> static constexpr value_t get_local(std::tuple<>)
{
static_assert(always_false<k>::value, "Hit bad case!");
return std::declval<value_t>();
}
需要 always_false
实用程序来使断言条件依赖,因此模板不是格式错误的;不需要诊断,因为 static_assert(false, ...)
可以做到。
请注意,您在自己的条件运算符中自己实例化了此重载:
(pair::key == k) ? pair::value : get_local<k>(std::tuple<pairs...>{});
当您遇到具有单个元素的元组的情况时。条件表达式的两个 "branches" 都必须有效。最好用 if constepxr
:
if constexpr (pair::key == k) return pair::value;
else return get_local<k>(std::tuple<pairs...>{});
因为您确实指出 pair::key == k
可以在常量表达式中求值。