ich verschiedene Elementfunktionen auf der Basis ein integralen Klasse Template-Parameter wie so aktivieren versuchen:C++ - 14 enable_if_t mit Elementfunktion der Klasse auf integralem Typ Templat wählen
#include <type_traits>
template<int Dimension>
struct Foo
{
template<std::enable_if_t<Dimension == 1> = 0>
int bar(int i) const { return i; }
template<std::enable_if_t<Dimension == 2> = 0>
int bar(int i, int j) const { return i + j; }
};
int main(int argc, const char **argv)
{
Foo<1> a;
a.bar(1);
Foo<2> b;
b.bar(1,2);
return 0;
}
Mit gcc5 in C++ - 14-Modus es schlägt mit den folgenden Fehler zu kompilieren:
tools/t1.cpp: In instantiation of 'struct Foo<1>':
tools/t1.cpp:18:12: required from here
tools/t1.cpp:13:9: error: no type named 'type' in 'struct std::enable_if<false, int>'
int bar(int i, int j) const { return i + j; }
^
tools/t1.cpp: In instantiation of 'struct Foo<2>':
tools/t1.cpp:21:12: required from here
tools/t1.cpp:10:9: error: no type named 'type' in 'struct std::enable_if<false, int>'
int bar(int i) const { return i; }
Diese scheinen die SFINAE angezeigt nicht tut, was ich erwarten würde, da die enable_if_t richtig zu funktionieren scheint.
In diesem trivialen Beispiel würde Überladung auch funktionieren, aber in meinem tatsächlichen Anwendungsfall muss ich die Funktionen verstecken, um zufällige Verwendung und/oder Kompilierungsfehler je nach den Umständen zu verhindern.
Was fehlt mir bei SFINAE hier?
Perfekt. Vielen Dank. – RandomBits
@ T.C. Ich vermute stark, dass Ihr Satz, * Substitutionsfehler ist kein Elefant *, einen Fehler enthält (obwohl man nicht sagen kann, dass es tatsächlich falsch ist). – skypjack
Guter Hinweis das * Wachpaket *, dachte nie an diese Technik: * + 1 *. – skypjack