Ho un tipo simile:condizionale definizione di tipo alias
template<typename T>
struct wrapper
{
using foo = typename T::foo;
using bar = typename T::bar;
using baz = typename T::baz;
// More of those...
};
desidero foo
, bar
, baz
ed equivalenti di tipo alias da definire se e solo se il tipo equivalente esiste in T
. Le soluzioni che utilizzano std::conditional
consentono di sostituirlo con qualcos'altro quando non esiste, ma non so come assicurarsi che non esista affatto quando il tipo corrispondente non esiste nel tipo di modello. Il codice sopra riportato genera un errore quando wrapper<T>
viene istanziato se T
non definisce uno degli alias di tipo.
non posso fare wrapper
erediti da T
perché wrapper
non dovrebbe fare tutto T
può fare. Inoltre, l'utilizzo di una specializzazione parziale porterebbe a una sorta di esplosione esponenziale e diventerebbe rapidamente non mantenibile. Probabilmente potrei fare foo
, bar
... tipo alias template per iniettare un std::enable_if
in un parametro modello predefinito, ma poi gli utenti avrebbero dovuto scrivere wrapper<T>::foo<>
, wrapper<T>::bar<>
invece di wrapper<T>::foo
, wrapper<T>::bar
, ecc ... e io non voglio questo.
Esiste un modo semplice ma gestibile per definire un alias di questo tipo solo quando esiste l'alias di tipo corrispondente in T
?
Questa è la soluzione che avevo in mente ed ero pronto a provarlo. Non è molto carino, ma è più gestibile rispetto alle altre soluzioni senza esporre gli utenti a cose inutili. Grazie :) – Morwenn
Dang. Speravo che ci sarebbe stata una soluzione migliore di questa. – Justin