我有类似于 integral_constant
的类将编译时 bool 值 constexpr 作为参数。现在我想创建 is_signed
特征,应该检查是否is_integral<T>
计算结果为真,如果是,我将检查是否 T(-1) < T(0)
.
这个特征是否适用于任何给定类型,或者它是否会在无法使用 -1 和 0 值构造的类型上失败?换句话说,模板参数列表中的constexpr bool 表达式是否短路?
最佳答案
它不会“短路”,因为即使没有实际求值,表达式仍然必须有效,因此您需要添加一个间接层。
一种可能的解决方案:
namespace details {
// primary template for integrals
template<class T, bool = is_integral<T>::value>
struct is_signed_integral_impl : std::integral_constant<bool, T(-1) < T(0)> {};
// not integral
template<class T>
struct is_signed_integral_impl<T, false> : std::false_type {};
}
template<class T>
struct is_signed_integral : details::is_signed_integral_impl<T> {};
关于c++ - 模板参数列表短路?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30110375/