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;
}
Recibo un error:
error C2039: 'type' : is not a member of 'std::tr1::enable_if<_Test,_Type>'
Obviamente, yo no entiendo cómo utilizar enable_if
. Lo que estaba pensando era que puedo habilitar una o la segunda función miembro de un conjunto de funciones miembro durante el tiempo de compilación, pero no funciona. ¿Alguien podría explicarme cómo hacerlo correctamente?
Editado
Lo que realmente no puedo entender es por qué no hay typedef
en uno de esos def. El compilador no puede encontrarlo y no lo compilará.
Podría dar algún ejemplo por favor? –
@There: hay un ejemplo del uso del segundo enfoque (que especializa una plantilla de clase) en [la documentación Boost 'enable_if'] (http://beta.boost.org/doc/libs/1_44_0/libs/utility/enable_if .html) (ver sección 3.1). –
gracias por el enlace. Voy a leerlo ahora. –