Si utiliza std::conditional
en lugar de if_
plantilla de clase que se aplica en @Matthieu en su respuesta, entonces su solución reduciría a esto:
template <typename T, typename U>
struct select_base
{
typedef typename std::conditional<std::is_base_of<T, Base>::value, T, U>::type base_type;
};
O simplemente esto:
template <typename T, typename U>
struct select_base : std::conditional<std::is_base_of<T, Base>::value, T, U> {};
que parece aun mejor.
La diferencia entre estas dos soluciones es que en la primera solución le das a un programador de usar nombre al tipo anidado, como yo he dado base_type
, mientras que en la segunda solución del tipo anidado es sólo type
cuales no se ve tan amigable con los programadores.
Tenga en cuenta que en las dos soluciones anteriores, usted tiene que utilizar el tipo anidado, ya sea como select_base<T,U>::base_type
(en la primera solución) o select_base<T,U>::type
(en la segunda solución — y debido a eso, si has utilizar como typename
usted se ha escrito en la propia pregunta
sin embargo, si en lugar uso de alias plantilla, definido como:.
template<typename T, typename U>
using base_type = typename std::conditional<std::is_base_of<T, Base>::value, T, U>::type;
entonces puede utilizar base_type<T,U>
sin ningún tipo anidado y typename
como:
template <typename T1, typename T2>
struct test
{
//typename select_base<T1, T2>::type m_ValueOfBaseType; //ugly!
base_type<T1, T2> m_ValueOfBaseType; //better
};
Espero que ayude.
¿Cuál es tu pregunta? – Nawaz
Su pregunta no está clara. Desea seleccionar el tipo de base entre los dos tipos 'T1' o' T2', por ejemplo, si 'T1' deriva de' T2', entonces el tipo de salida debe ser 'T2'. ¿O desea seleccionar el tipo que deriva de un tercer tipo, decir 'base'? – Nawaz
@Nawaz: del ideone vinculado, yo diría que 'Base' está fijo y él quiere elegir cualquiera de 'T1' o' T2' deriva de ello. –