2013-09-28 10 views
10

Come è possibile eseguire std::has_virtual_destructor e controlli simili? Ho provato a guardare l'intestazione type_traits in Visual Studio, ma ci sono troppe macro e modelli per avere un'idea. Questo controllo può essere espresso in qualsiasi forma ragionevolmente semplice? Mi piacerebbe almeno conoscere il principio del suo funzionamento, perché adesso non ne ho idea.Come è implementato std :: has_virtual_destructor?

+7

È magia del compilatore. Non è possibile implementarlo in C++ standard. Boost fornisce questa classe di tratto e usano intrinseche specifiche del compilatore. Controlla [questa intestazione] (http://www.boost.org/doc/libs/1_53_0/boost/type_traits/intrinsics.hpp). – jrok

+0

@jrok: sei sicuro? Perché allora non è una parola chiave del compilatore? BTW, sono abbastanza sicuro che Boost lo avesse prima dei compilatori C++ 0x. –

+0

Vedere commento aggiornato. – jrok

risposta

13

Molti dei caratteri di tipo richiedono la magia del compilatore: i tratti forniscono essenzialmente un'interfaccia di libreria ad alcuni hook forniti dai diversi compilatori. Il modo in cui i compilatori implementano questi hook dipende interamente da loro e non esiste un'interfaccia coerente.

Nell'attuale riunione è stata discussa l'aggiunta di una riflessione su una revisione futura che potrebbe portare a un'implementazione di libreria se tratti come std::has_virtual_destructor<T>. Tuttavia, ci vorrà un po 'prima che emerga qualcosa di simile alla riflessione.

+1

Perché non avrebbero standardizzato l'interfaccia di detti ganci per così tanti anni? –

+0

@VioletGiraffe Non l'hanno fatto? – jrok

+0

@VioletGiraffe: puoi considerare l'interfaccia tratti per essere i ganci. In pratica, i produttori di compilatori hanno un approccio diverso per esporre effettivamente la funzionalità e, anche se ho chiesto circa molti anni fa di creare un'interfaccia coerente, i produttori di compilatori hanno affermato che il rispetto di un approccio specifico sarebbe troppo vincolante. –

Problemi correlati