Sí, es ... pero probablemente no funcione de la manera esperada.
template < typename T >
void foo()
{
if (is_same<T,SomeClass>::value) ...;
else if (is_same<T,SomeClass2>::value) ...;
}
Puede obtener is_same
de std::
o boost::
función de su deseo/compilador. El primero solo está en C++ 0x.
El problema viene con lo que está en ...
. Si espera poder hacer alguna llamada a funciones específica para esos tipos dentro de foo, está tristemente equivocado. Se producirá un error de compilación aunque esa sección de código nunca se ejecute cuando se pasa algo que no obedece a esa interfaz esperada.
Para resolver ESE problema necesita hacer algo un poco diferente. Me gustaría recomendar la etiqueta de despacho:
struct v1_tag {};
struct v2_tag {};
template < typename T > struct someclass_version_tag;
template < > struct someclass_version_tag<SomeClass> { typedef v1_tag type; };
template < > struct someclass_version_tag<SomeClass2> { typedef v2_tag type; };
void foo(v1_tag) { ... }
void foo(v2_tag) { ... }
template < typename T > void foo()
{
typedef typename someclass_version_tag<T>::type tag;
foo(tag());
}
Tenga en cuenta que usted no estar sufriendo ningún tipo de gastos de ejecución polimorfismo aquí y con optimizaciones encendidos que debería dar lugar a la misma o incluso menor tamaño del código y la velocidad (aunque no deberías Te preocupes por eso de todos modos hasta que hayas ejecutado un generador de perfiles.
¿Es posible devolver diferentes tipos basados en version_tag? – Boying
Claro. Necesitará encontrar la manera de consultar la información si está atrapado en C++ 03, o usará el modo automático en C++ 11 en adelante. Siempre que no intente devolver diferentes tipos dentro de la misma instanciación, no tendrá ningún problema. –
ahora con C++ 17, puede usar declaraciones constexpr if para hacer esto trivialmente – xaxxon