Мне нужно получить тип, который был предоставлен при создании экземпляра шаблона. Рассмотрим следующий пример: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();
}
Я пропустил любое более элегантное и менее подробное решение?
вы пробовали 'FooInt :: TUnderlying' вместо' decltype (FooInt) :: TUnderlying'?Я не вижу, что вы ожидаете получить через 'decltype' здесь. – sellibitze
Все, что вы добавляете, это 'ScopeOperatorWorkaroundWrapper <>', я не знаю, сколько «менее подробных» вы могли бы захотеть. В конце концов, это обходной путь. – PlasmaHH