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