很抱歉问这么简单的问题,但我找不到答案。谷歌没有说“C ++ negation integral_constant”和类似的查询。
C ++ 11中是否有任何特性使std::true_type
std::false_type
成为std::is_same<my_static_bool, std::false_type>
,反之亦然?换句话说,我想要一些更加可重复的版本
{{1}}
我当然知道我可以自己写,但如果有的话,我想使用现有的。
答案 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), "");
}
上的输出
答案 2 :(得分:1)
类型true_type
和false_type
有一个嵌套的typedef引用自己,所以你可以写:
std::is_same<my_static_bool::type,std::false_type>::value
根据上下文的不同,如果您的类型确实为!my_static_bool{}
,则constexpr
可能更为简单,true
值为std::false_type
。