2016-05-27 15 views
3

Ich habe über SFINAE Lesen und einige Beispiele mit einigen Variante der folgenden sehen:Wo bekommt ":: value" seinen Wert?

#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; 
} 

(Entnommen https://en.wikipedia.org/wiki/Substitution_failure_is_not_an_error)

Ich bin verwirrt, wo das value Mitglied herkommt. Beide Definitionen von has_typedef_foobar scheinen keinen booleschen Member benannten Wert anzugeben.

Woher bekommt ::value seinen Wert? Ich vermute, dass es sich um einen vom Compiler bereitgestellten Wert handelt und möchte darüber nachlesen, aber ich bin mir nicht sicher, welcher Begriff für Google verwendet wird, da meine Abfragen andere C++ 11-bezogene, wertbezogene Themen aufgeworfen haben.

Danke.

+4

Betrachten Sie 'std :: true_type' und' std :: false_type'. –

Antwort

7

std::true_typestd::false_type und sind definiert als:

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

sind. Das heißt, sie sind zwei separate Instanzen von std::integral_constant.

Nun, wenn man sich eine mögliche Implementierung von std::integeral_constant:

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

unter anderem Sie eine static constexpr Variable value genannt sehen werden. Wenn Sie std::integeral_constant als std::integral_constant<bool, true> instanziieren, wird value Mitgliedsvariable in der Instatication natürlich auf true festgelegt. Wenn Sie in der gleichen Weise std::integral_constant als std::integral_constant<bool, false> instanziieren, wird die value Mitgliedsvariable auf false festgelegt.

Vererben von std::true_type Sie auch die Variable value Mitglied erben, die true und erben von std::false_type Typ eingestellt ist auch die value Membervariable erben, die auf false gesetzt.

+0

Danke. Es brachte mich nicht sofort dazu, 'std :: true_type' zu ​​suchen, da ich dachte, dass es eine Syntax von' struct' war, von der ich nicht wusste. – Teeeeeeeeeeeeeeeeeeeeeeeeeeeej