c++ - 模板参数列表短路?

标签 c++ templates

我有类似于 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/

相关文章:

c++ - websocket计时器滴答后 boost asio短读错误

python - 拥有 Django 的 {% trans %} 标签

c++ - 强制非专用模板实例化出现编译错误

c++ - 如何使用 std::max 或 std::min 作为函数参数

c++ - 使用带有 fstream 的映射的段错误

c++ - Emscripten:警告:未解析的符号:_ZTVN10__cxxabiv120__si_class_type_infoE

c++ - 调试 C/C++ 语言不命中断点

c++ - 后缀运算符不应该被认为是二元运算符吗

C++自动推导模板成员指针的类型

c++ - 模板函数的前向声明