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;
}
出力は、私は両方の実装が同じであることを思わせる特徴、両方のために期待されるようです。何か不足していますか? ありがとうございます。
私は唯一の違いはvoid_tを使用していることです、彼はいつも無効になるdecltype +カンマ演算子のトリックを使用して、任意のタイプを得ることができます - あなたの例ではvoidを選択しました。それ以外の場合は同じです。 –
@ TareqA.Siraj:そうです。 –