否定std :: integral_constant <bool> </bool>

时间:2013-02-06 20:03:11

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

很抱歉问这么简单的问题,但我找不到答案。谷歌没有说“C ++ negation integral_constant”和类似的查询。

C ++ 11中是否有任何特性使std::true_type std::false_type成为std::is_same<my_static_bool, std::false_type> ,反之亦然?换句话说,我想要一些更加可重复的版本

{{1}}

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

3 个答案:

答案 0 :(得分:6)

没有,因为它基本上是一个单行,<type_traits>应该尽可能小。

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

用法:

static_not<my_static_bool>

这是正确的方法,因为标准始终显示“false_type或从此类推导出”,因此您不能依赖等于std::false_type。我通常会放宽“有一个constexpr布尔::value属性”因为我没有使用标签调度。

答案 1 :(得分:2)

以下代码使用模板元函数转发(即它继承自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

上的输出

答案 2 :(得分:1)

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

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

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