Ho bisogno di ottenere il tipo che è stato fornito durante l'istanziazione di un modello. Considerare il seguente esempio:decltype e l'operatore scope in 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;
}
Il problema con questo codice utilizza l'operatore di ambito insieme a decltype. Visual C++ 2010 si lamenta così:
errore C2039: 'TUnderlying': non è un membro di '`namespace globale''
ho raccolto alcune informazioni sul tema su Wikipedia:
Commentando il Draft di commissione formale per C++ 0x, il membro del membro ISO giapponese ha osservato che "un operatore di ambito (: :) non può essere applicato a decltype, ma dovrebbe essere. Sarebbe utile nel caso di ottenere il tipo di membro (nidificato- tipo) da un'istanza come segue ": [16]
vector<int> v;
decltype(v)::value_type i = 0; // int i = 0;
Questo e altri problemi simili sono stati affrontati da David Vandevoorde e votati nel documento di lavoro nel marzo 2010.
Quindi penso che il Visual C++ 2010 non lo abbia implementato. Mi è venuta in mente questa soluzione:
template <typename T> struct ScopeOperatorWorkaroundWrapper
{
typedef typename T::TUnderlying TTypedeffedUnderlying;
};
auto Automatic() -> ScopeOperatorWorkaroundWrapper<decltype(FooInt)>::TTypedeffedUnderlying
{
return ScopeOperatorWorkaroundWrapper<decltype(FooInt)>::TTypedeffedUnderlying();
}
Ho perso una soluzione più elegante e meno dettagliata?
Hai provato 'FooInt :: TUnderlying' invece di' decltype (FooInt) :: TUnderlying'?Non vedo cosa ti aspetti di guadagnare con 'decltype' qui. – sellibitze
Tutto quello che aggiungi è 'ScopeOperatorWorkaroundWrapper <>', non so quanto "meno dettagliato" lo si possa desiderare. Dopo tutto, è una soluzione. – PlasmaHH