Dans le code:Comment utiliser enable_if pour activer les fonctions membres en fonction des paramètres du modèle de classe
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;
}
Je reçois une erreur:
error C2039: 'type' : is not a member of 'std::tr1::enable_if<_Test,_Type>'
Il est évident que je ne comprends pas comment utiliser enable_if
. Ce que je pensais était que je peux activer une ou une deuxième fonction membre à partir d'un ensemble de fonctions membres pendant la compilation, mais cela ne fonctionne pas. Quelqu'un pourrait-il m'expliquer comment le faire correctement?
Edité
Ce que je ne comprends vraiment pas pourquoi n'est pas là typedef
dans un de ces def. Le compilateur ne peut pas le trouver et ne le compilera pas.
pourrait vous fournir un exemple s'il vous plaît? –
@Il y a un exemple d'utilisation de la seconde approche (spécialisation d'un template de classe) dans [la documentation Boost 'enable_if'] (http://beta.boost.org/doc/libs/1_44_0/libs/utility/enable_if .html) (voir la section 3.1). –
merci pour le lien. Je vais le lire maintenant. –