【问题标题】:negation of std::integral_constant<bool>std::integral_constant<bool> 的否定
【发布时间】:2013-02-06 20:03:11
【问题描述】:

很抱歉问了这么简单的问题,但我无法轻易找到答案。 Google 对“C++ negation integral_constant”和类似查询没有任何有趣的说法。

在 C++11 中是否存在使 std::true_typestd::false_type 不同的特征,反之亦然?换句话说,我想要一些更易读的版本

std::is_same<my_static_bool, std::false_type>

我当然知道我可以自己写,但如果有的话我想使用现有的。

【问题讨论】:

  • !my_static_bool有什么问题?
  • @DavidRodríguez-dribeas:我认为my_static_bool 是一个整数常数,所以他必须写std::integral_constant&lt;bool, !my_static_bool::value&gt;(故意没有::value)才能使它正确。
  • @ipc constexpr operator! 可能会实现,但还没有尝试过。
  • @MaximYegorushkin:您不能对类型应用运算符。
  • @ipc:从上面的测试来看,my_static_bool 似乎可以是std::false_type(或者我想可能是std::true_type)。除此之外,我不太明白你的评论...std::integral_constant 有一个constexpr 转换运算符operator value_type()std::false_type 的情况下产生false,它可以与 一起使用不产生true常量表达式

标签: c++ c++11 template-meta-programming typetraits boost-mpl


【解决方案1】:

没有,因为它本质上是单行的,&lt;type_traits&gt; 应该尽可能小。

template <typename T> using static_not = std::integral_constant<bool, !T::value>;

用法:

static_not<my_static_bool>

这是正确的方法,因为标准总是说“false_type 或派生自此类”,因此您不能依赖等于 std::false_type。我通常将其放松为“拥有一个 constexpr boolean ::value 属性”,因为我不使用标签调度。

【讨论】:

    【解决方案2】:

    另一种方法:

    template <typename T>
    using static_not = typename std::conditional<
        T::value,
        std::false_type,
        std::true_type
    >::type;
    

    【讨论】:

      【解决方案3】:

      以下代码使用模板元函数转发(即它继承自 std::integral_constant 并带有一个取反的布尔值,这当然是受到大量使用此模式的 Boost.MPL 的启发)

      #include <type_traits>
      
      template<typename T>
      struct logical_not
      :
          std::integral_constant<bool, !T::value>
      {};
      
      int main()
      {
         typedef logical_not<std::false_type>::type T;
         typedef logical_not<std::true_type>::type F;
      
         static_assert((std::is_same<T, std::true_type>::value), "");
         static_assert((std::is_same<F, std::false_type>::value), "");   
      }
      

      LiveWorkSpace 上的输出

      【讨论】:

        【解决方案4】:

        true_typefalse_type 类型有一个引用自身的嵌套 typedef,所以你可以这样写:

        std::is_same<my_static_bool::type,std::false_type>::value
        

        根据上下文,只执行!my_static_bool{} 可能更简单,如果您的类型确实是std::false_type,则constexpr 的值为true

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-07-06
          • 1970-01-01
          • 1970-01-01
          • 2012-09-08
          • 2017-06-03
          • 1970-01-01
          • 2013-12-20
          • 1970-01-01
          相关资源
          最近更新 更多