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.
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. –
@ TareqA.Siraj: Ja. –