Dopo aver risposto alla domanda this stavo cercando di trovare il modello is_complete
nella libreria Boost e mi sono reso conto che non esiste un modello di questo tipo in Boost.TypeTraits. Perché non esiste un modello simile nella libreria Boost? Come dovrebbe essere?Come scrivere il modello `is_complete`?
//! Check whether type complete
template<typename T>
struct is_complete
{
static const bool value = (sizeof(T) > 0);
};
...
// so I could use it in such a way
BOOST_STATIC_ASSERT(boost::is_complete<T>::value);
Il codice di cui sopra non è corretto, perché è illegale applicare sizeof
a un tipo incompleto. Quale sarà una buona soluzione? È possibile applicare SFINAE in questo caso in qualche modo?
Beh, questo problema non poteva essere risolto in generale senza violare la ODR rule, ma c'è una specifica piattaforma solution che funziona per me.
penso che questo non può funziona in linea di principio (tranne quando lo si applica sempre a un tipo che rimane sempre incompleto o è sempre completo). Perché se 'U' è completo o no,' is_complete 'specifica sempre lo stesso tipo. Se ora vai e usi 'is_complete ' in due diverse unità di traduzione, il membro del valore potrebbe avere un valore diverso ogni volta e il compilatore è libero in quale valore utilizza. Penso che questo non è valido, ma non riesco a trovare una dichiarazione dello Standard su questo :(Sarebbe felice se tu potessi scoprirlo. –
La domanda più grande è perché. Senza riflessione perché hai bisogno di questo come il compilatore sa a tempo del compilatore –
Anche in C++ 03 non è possibile eseguire questa operazione. Al massimo con C++ 0x con "sfinae for expressions", ma anche se si passa 'vector' ad esempio e' vector' viene dichiarato solo ma non definito, quindi la verifica della completezza produrrà una istanziazione implicita e, se la definizione non è disponibile, genererà un errore grave non coperto da sfinae (l'errore non è nel "contesto immediato"). –