2016-05-27 5 views
3

I SFINAEについてまで読み、次のいくつかのバリエーションを持ついくつかの例を見てきました。":: value"はどこから値を取得しますか?

https://en.wikipedia.org/wiki/Substitution_failure_is_not_an_errorからの引用)
#include <iostream> 
#include <type_traits> 

template <typename... Ts> using void_t = void; 

template <typename T, typename = void> 
struct has_typedef_foobar : std::false_type {}; 

template <typename T> 
struct has_typedef_foobar<T, void_t<typename T::foobar>> : std::true_type {}; 

struct foo { 
    using foobar = float; 
}; 

int main() { 
    std::cout << std::boolalpha; 
    std::cout << has_typedef_foobar<int>::value << std::endl; 
    std::cout << has_typedef_foobar<foo>::value << std::endl; 
} 

私はvalueメンバーがどこから来るのと困惑しています。 has_typedef_foobarのどちらの定義も、valueという名前のブール値メンバーを指定していないようです。

::valueはどこですか?私はそれがコンパイラ提供の価値のいくつかのものだと思うし、それについて読んでみたいが、私の質問が他のC++ 11関連の価値関連の話題を持ち出して以来、どの言葉がGoogleにはわからない。

ありがとうございました。それぞれ

using true_type = std::integral_constant<bool, true> 
using false_type = std::integral_constant<bool, false> 

+4

'std :: true_type'と' std :: false_type'を見てください。 –

答えて

7

std::true_typestd::false_typeは以下のように定義されています。つまり、std::integral_constantの2つの別々のインスタンス化です。

あなたがstd::integeral_constantの可能な実装を見れば今:とりわけ

template<class T, T v> 
struct integral_constant { 
    ... 
    static constexpr T value = v; 
    ... 
}; 

あなたはvalueという名前static constexprの変数が表示されます。当然、std::integeral_constantstd::integral_constant<bool, true>とインスタンス化すると、valueのメンバー変数がtrueに設定されます。同様に、std::integral_constantstd::integral_constant<bool, false>としてインスタンス化すると、そのvalueメンバ変数はfalseに設定されます。

あなたもあなたもfalseに設定されているvalueメンバ変数を継承trueに設定し、std::false_typeタイプから継承しているvalueメンバ変数を継承std::true_typeから継承。

+0

ありがとうございます。私が気付いていなかった 'struct'の構文の一部だと思っていたので、' std :: true_type'を調べるのはすぐには気にしませんでした。 – Teeeeeeeeeeeeeeeeeeeeeeeeeeeej

関連する問題