2016-03-14 6 views
5

Letztes Mal habe ich viele Antworten auf SFINAE gefunden, die die Verwendung von void_t helper empfehlen. Aber ich verstehe nicht, was das Besondere an declltype (..., void()) ist. Betrachten Sie das Beispiel:Unterschied zwischen decltype (..., void()) und void_t

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

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

template <typename T> 
struct has_foo <T, decltype (T().foo(), void())> : std::true_type {}; 

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

template <typename T> 
struct has_bar <T, void_t <decltype (T().bar())> > : std::true_type {}; 

class MyClass1 
{ 
public: 
    int foo() { return 3; } 
}; 

class MyClass2 
{ 
public: 
    double bar() { return 5.4; } 
}; 

int main() { 

    std::cout << has_foo<MyClass1>::value << std::endl; 
    std::cout << has_foo<MyClass2>::value << std::endl; 
    std::cout << has_bar<MyClass1>::value << std::endl; 
    std::cout << has_bar<MyClass2>::value << std::endl; 

    return 0; 
} 

Der Ausgang ist als für beide Züge erwartet, die mich denken lässt, dass beide Implementierungen gleich sind. Fehle ich etwas? Danke.

Antwort

4

Es ist eine ausdrucksvolle, weniger umständliche Art, das Gleiche zu sagen.

Das ist es.

+0

Der einzige Unterschied, den ich sehe, ist die Verwendung von void_t, er wird immer void, wo mit dem Deklinations + Komma Operator Trick, können Sie jeden gewünschten Typ bekommen - in Ihrem Beispiel haben Sie nur void gewählt. Ansonsten ist es das Gleiche. –

+0

@ TareqA.Siraj: Ja. –