5

簡単な質問で申し訳ありませんが、簡単に答えを見つけることができません。Googleは、「C++否定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::valueタグディスパッチを使用しないため、通常は「constexprブールプロパティを持つ」ように緩和します。

于 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 に答える