2016-04-27 4 views
3

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?

Antwort

7

Substitutionsfehler ist kein Elefant , wenn es während der Vorlage Argumentabzug passiert.

Auch enable_if_t<true> ist void, und Sie können keine void Vorlage nicht-Typ-Parameter haben.

Aufschieben Auswertung mit einem Standard-Template-Argument:

template<int Dimension> 
struct Foo 
{ 
    template<int..., int I = Dimension, std::enable_if_t<I == 1, int> = 0> 
    int bar(int i) const { return i; } 
    // etc. 
}; 

Der unbenannte Parameter Pack int... schützt gegen Versuche ausdrücklich I angeben.

+0

Perfekt. Vielen Dank. – RandomBits

+0

@ 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

+0

Guter Hinweis das * Wachpaket *, dachte nie an diese Technik: * + 1 *. – skypjack

Verwandte Themen