In my previous question Ho voluto utilizzare static_assert per limitare un sottotipo di modello a un parametro del modello. La domanda è stato risposto, il codice per Scilla, che è la seguente:C++ 11 static_assert: messaggi di errore parametrizzati
template <typename T>
struct X {
static_assert(std::is_base_of<Y,T>::value,"T must be derived from Y!");
};
Ora, voglio fare il messaggio di errore più concisa. Io, voglio precisare quale tipo sta violando questo vincolo. Ad esempio, se la classe A
non è derivata da Y
e qualcuno instanciate X<A>
, il messaggio di errore deve essere stampato "Il parametro tipo deve essere derivato da Y, ma A non è".
È in qualche modo raggiungibile con la libreria standard?
vedo due sfide:
- Assemblaggio stringhe a compiletime senza usare boost :: MPL
- recuperare il nome del tipo con cui è stato istanziare T. Il nome dovrebbe essere significativo, idealmente lo stesso utilizzato nella definizione di violazione. Ho provato typeid (T) .name() ma restituisce solo il nome storpiato che non è accettabile. Ricordo che c'era una specie di macro che restituisce il nome di qualcosa, ma non riesco più a ricordarlo.
correlate (peraps anche ingannano): http://stackoverflow.com/q/6415186/34509 –