很抱歉问了这么简单的问题,但我无法轻易找到答案。谷歌对“C++ negation integral_constant”和类似查询没有任何有趣的说法。
在 C++11 中是否有任何特征,std::true_type
反之亦然std::false_type
?换句话说,我想要一些更易读的版本
std::is_same<my_static_bool, std::false_type>
我当然知道我可以自己写,但如果有的话,我想使用现有的。
很抱歉问了这么简单的问题,但我无法轻易找到答案。谷歌对“C++ negation integral_constant”和类似查询没有任何有趣的说法。
在 C++11 中是否有任何特征,std::true_type
反之亦然std::false_type
?换句话说,我想要一些更易读的版本
std::is_same<my_static_bool, std::false_type>
我当然知道我可以自己写,但如果有的话,我想使用现有的。
没有,因为它本质上是单线的,<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
属性”,因为我不使用标签调度。
还有另一种方法:
template <typename T>
using static_not = typename std::conditional<
T::value,
std::false_type,
std::true_type
>::type;
下面的代码使用模板元函数转发(即它继承自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上的输出
类型true_type
和false_type
有一个引用自身的嵌套 typedef,因此您可以编写:
std::is_same<my_static_bool::type,std::false_type>::value
根据上下文,它可能会更简单,如果您的类型确实是!my_static_bool{}
,这是constexpr
有价值的。true
std::false_type