In Code zu aktivieren:Wie enable_if verwenden, um Elementfunktionen basierend auf Template-Parameter der Klasse
template<class T>
struct is_builtin
{
enum {value = 0};
};
template<>
struct is_builtin<char>
{
enum {value = 1};
};
template<>
struct is_builtin<int>
{
enum {value = 1};
};
template<>
struct is_builtin<double>
{
enum {value = 1};
};
template<class T>
struct My
{
typename enable_if<is_builtin<T>::value,void>::type f(T arg)
{
std::cout << "Built-in as a param.\n";
}
typename enable_if<!is_builtin<T>::value,void>::type f(T arg)
{
std::cout << "Non - built-in as a param.\n";
}
};
struct A
{
};
int main()
{
A a;
My<int> m;
My<A> ma;
m.f(1);
ma.f(a);
return 0;
}
Ich erhalte eine Fehlermeldung:
error C2039: 'type' : is not a member of 'std::tr1::enable_if<_Test,_Type>'
Offensichtlich verstehe ich nicht, wie zu bedienen enable_if
. Was ich dachte war, dass ich während der Kompilierungszeit eine oder eine zweite Mitgliedsfunktion aus einer Reihe von Mitgliedsfunktionen aktivieren kann, aber es funktioniert nicht. Könnte mir bitte jemand erklären, wie man es richtig macht?
Bearbeitet
Was ich wirklich nicht verstehen kann ist, warum nicht typedef
in einem dieser def. Compiler kann es nicht finden und wird es nicht kompilieren.
Sie bitte einige Beispiele bieten könnte? –
@There: Es gibt ein Beispiel für die Verwendung des zweiten Ansatzes (spezialisiert auf eine Klassenvorlage) in [der Boost 'enable_if' Dokumentation] (http://beta.boost.org/doc/libs/1_44_0/libs/utility/enable_if .html) (siehe Abschnitt 3.1). –
danke für den link. Ich werde es jetzt lesen. –