5

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

在 C++11 中是否有任何特征,std::true_type反之亦然std::false_type?换句话说,我想要一些更易读的版本

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

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

4

4 回答 4

7

没有,因为它本质上是单线的,<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属性”,因为我不使用标签调度。

于 2013-02-06T20:10:34.807 回答
4

还有另一种方法:

template <typename T>
using static_not = typename std::conditional<
    T::value,
    std::false_type,
    std::true_type
>::type;
于 2013-02-06T20:15:24.340 回答
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上的输出

于 2013-02-06T20:09:15.747 回答
1

类型true_typefalse_type有一个引用自身的嵌套 typedef,因此您可以编写:

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

根据上下文,它可能会更简单,如果您的类型确实是!my_static_bool{},这是constexpr有价值的。truestd::false_type

于 2013-02-06T20:08:50.480 回答