decltype e o operador de escopo em C ++

Preciso obter o tipo que foi fornecido ao instanciar um modelo. Considere o seguinte exemplo:

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;
}

problema com este código é usar o operador de escopo junto com decltype. O Visual C ++ 2010 reclama assim:

erro C2039: 'TUnderlying': não é membro de '' espaço para nome global ''

Reuni algumas informações sobre o tópico na Wikipedia:

Enquanto comentava o rascunho formal do Comitê para C ++ 0x, o organismo japonês membro da ISO observou que "um operador de escopo (: :) não pode ser aplicado ao decodificador, mas deveria ser. Seria útil no caso obter membro tipo (tipo aninhado) de uma instância da seguinte forma ": [16]

vector<int> v;
decltype(v)::value_type i = 0; // int i = 0;

Este e outros problemas semelhantes foram abordados por David Vandevoorde e votados no documento de trabalho em março de 2010.

Assim eu acho que o Visual C ++ 2010 não tem isso implementado. Eu vim com esta solução alternativa:

template <typename T> struct ScopeOperatorWorkaroundWrapper
{
  typedef typename T::TUnderlying TTypedeffedUnderlying;
};

auto Automatic() -> ScopeOperatorWorkaroundWrapper<decltype(FooInt)>::TTypedeffedUnderlying
{
  return ScopeOperatorWorkaroundWrapper<decltype(FooInt)>::TTypedeffedUnderlying();
}

Perdi alguma solução mais elegante e menos detalhada?

questionAnswers(6)

yourAnswerToTheQuestion