Para ver cómo funcionaba, miré la implementación libstdC++ de std::common_type
en el encabezado type_traits
. Tengo que admitir que realmente no entiendo cómo funciona. Aquí está:std :: common_type implementation
/// common_type
template<typename... _Tp>
struct common_type;
template<typename _Tp>
struct common_type<_Tp>
{ typedef _Tp type; };
template<typename _Tp, typename _Up>
struct common_type<_Tp, _Up>
{ typedef decltype(true ? declval<_Tp>() : declval<_Up>()) type; };
template<typename _Tp, typename _Up, typename... _Vp>
struct common_type<_Tp, _Up, _Vp...>
{
typedef typename
common_type<typename common_type<_Tp, _Up>::type, _Vp...>::type type;
};
Entiendo bien cómo funcionan la primera, segunda y cuarta declaraciones. Sin embargo, no logro entender cómo funciona la tercera declaración. ¿Podría alguien tratar de explicar el mecanismo utilizado aquí?
+1, una buena lectura sobre * magic * incluyendo el operador ternario: [Conditional Love: FOREACH redux] (http://www.artima.com/cppsource/foreach.html) –
Ok, creo que finalmente obtuve el truco. Por lo tanto, se basa en el hecho de que el operador ternario deduce sus tipos de retorno en función de sus operandos. No pensó en eso. ¡Gracias! – Morwenn