Necesito obtener el tipo que se proporcionó al crear una instancia de una plantilla. Considere el siguiente ejemplo:decltype y el operador de ámbito en C++
template <typename T> struct Foo
{
typedef T TUnderlying;
};
static Foo<int> FooInt;
class Bar
{
public:
auto Automatic() -> decltype(FooInt)::TUnderlying
{
return decltype(FooInt)::TUnderlying();
}
};
int main()
{
Bar bar;
auto v = bar.Automatic();
return 0;
}
El problema con este código es utilizar el operador de ámbito junto con decltype. Visual C++ 2010 se queja así:
error C2039: 'TUnderlying': no es un miembro de '`espacio de nombres global''
Reuní algo de información sobre el tema en la Wikipedia:
Al comentar el borrador del Comité formal para C++ 0x, el miembro miembro de ISO japonés señaló que "un operador de ámbito (:) no se puede aplicar a decltype, pero debería serlo. Sería útil en el caso obtener el tipo de miembro (anidado) tipo) de una instancia como sigue ": [16]
vector<int> v;
decltype(v)::value_type i = 0; // int i = 0;
Esto y otros problemas similares fueron abordados por David Vandevoorde, y votaron en el documento de trabajo en marzo de 2010.
Así que creo que el Visual C++ 2010 no tiene esto implementado. Se me ocurrió esta solución alternativa:
template <typename T> struct ScopeOperatorWorkaroundWrapper
{
typedef typename T::TUnderlying TTypedeffedUnderlying;
};
auto Automatic() -> ScopeOperatorWorkaroundWrapper<decltype(FooInt)>::TTypedeffedUnderlying
{
return ScopeOperatorWorkaroundWrapper<decltype(FooInt)>::TTypedeffedUnderlying();
}
¿Extraño alguna solución que sea más elegante y menos detallada?
¿Has probado 'FooInt :: TUnderlying' en lugar de' decltype (FooInt) :: TUnderlying'?No veo lo que espera obtener a través de 'decltype' aquí. – sellibitze
Todo lo que agrega es 'ScopeOperatorWorkaroundWrapper <>', no sé cuánto "menos detallado" podría quererlo. Después de todo, es una solución. – PlasmaHH