2012-06-15 13 views
8

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.
+1

correlate (peraps anche ingannano): http://stackoverflow.com/q/6415186/34509 –

risposta

7

Non è possibile farlo. static_assert vuole una stringa letterale. Non hai modo di assemblare l'identità semantica di T e Y nella stringa letterale.

si può sperare che il compilatore dà un facile leggere backtrace dello stack modello di istanza e ti dà il valore di T e Y parametri di modello della racchiude modello di classe di un'istanza.

Altre persone hanno pensato anche a questo, vedere http://comments.gmane.org/gmane.comp.compilers.clang.devel/5073 per esempio.

+0

Come sempre per la diagnosi, è un QoI. –

+0

che vergogna. Perché un letterale, una stringa costante di tempo di compilazione sarebbe migliore :(. – gexicide

+0

@gexicide In genere non è pratico creare stringhe costanti in fase di compilazione (oltre ai letterali, ovviamente.) Stampare i valori di una sequenza di compilazione arbitraria i valori delle costanti temporali e/o gli ID di tipo sarebbero comunque belli. – Potatoswatter