decltype и оператор области в 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;
}

Проблема с этим кодом заключается в использовании оператора области видимости вместе с decltype.Visual C ++ 2010 жалуется на это:

ошибка C2039: «TUnderlying»: не является членом «глобального пространства имен»

Я собрал некоторую информацию по этой теме в Википедии:

Комментируя официальный комитет В проекте для C ++ 0x, японского тела члена ISO отмечалось, что «оператор области видимости (: :) не может быть применен к decltype, но должен быть. Было бы полезно в случае получения типа члена (вложенного типа) из пример следующим образом ": [16]

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

Эта и подобные проблемы были рассмотрены Дэвидом Вандевурдом и включены в рабочий документ в марте 2010 года.

Итак, я считаю, что в Visual C ++ 2010 это не реализовано. Я нашел обходной путь:

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

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

Пропустил ли я какое-нибудь решение, более элегантное и менее подробное?

15
задан kennytm 15 February 2012 в 10:25
поделиться