Мне нужно получить тип, который был предоставлен при создании экземпляра шаблона. Рассмотрим следующий пример:
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();
}
Пропустил ли я какое-нибудь решение, более элегантное и менее подробное?