2016-03-14 14 views
5

前回私はvoid_tヘルパーの使用を提案しているSFINAEに関して多くの回答を得ました。しかし、私はdecltype(...、void())に関して何が特別なのか分からないようです。 例を考えてみましょう:decltype(...、void())と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; 
} 

出力は、私は両方の実装が同じであることを思わせる特徴、両方のために期待されるようです。何か不足していますか? ありがとうございます。

答えて

4

これは、表現力があり、同じことを言っても面倒ではありません。

これだけです。

+0

私は唯一の違いはvoid_tを使用していることです、彼はいつも無効になるdecltype +カンマ演算子のトリックを使用して、任意のタイプを得ることができます - あなたの例ではvoidを選択しました。それ以外の場合は同じです。 –

+0

@ TareqA.Siraj:そうです。 –

関連する問題