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?
risposta
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.
Perché non avrebbero standardizzato l'interfaccia di detti ganci per così tanti anni? –
@VioletGiraffe Non l'hanno fatto? – jrok
@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. –
- 1. Come std :: unordered_map è implementato
- 2. Come è implementato lo ordinamento per std :: deque?
- 3. Come è implementato __RTC_CheckEsp?
- 4. Come è dynamic_cast implementato
- 5. Perché std :: find è implementato in questo modo?
- 6. Come viene implementato l'inserimento di std :: vector? C++
- 7. Come mai std :: atomic <double> non è implementato durante la compilazione con clang?
- 8. come viene implementato il multi_index
- 9. Come è implementato fseek() nel filesystem?
- 10. Come è implementato perl -i * realmente *?
- 11. Come è implementato il fractions.limit_denominator di python?
- 12. Come withFile è implementato in Haskell
- 13. Come è implementato il flash Perlin-noise?
- 14. Come viene implementato set()?
- 15. Come viene implementato "const"?
- 16. Come viene implementato BigDecimal?
- 17. Perché non è implementato vector :: operator [] simile a map :: operator []?
- 18. Come standard è std :: thread?
- 19. Perché Hadoop non è implementato usando MPI?
- 20. Perché Linux memmove() è implementato così com'è?
- 21. come viene implementato il sarcmark?
- 22. Come viene implementato Google Calculator?
- 23. Come viene implementato maximal-munch?
- 24. Perché gmtime è implementato in questo modo?
- 25. Perché java.util.concurrent.atomic.AtomicBoolean è implementato internamente con int?
- 26. expectHEAD è documentato ma non implementato?
- 27. C++, std :: atomic, cosa è std :: memory_order e come usarli?
- 28. Come posso determinare se un metodo astratto è implementato?
- 29. Perché JML non è implementato come annotazioni in Java?
- 30. Perché VkBool32 di Vulkan è implementato come int unsigned?
È 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
@jrok: sei sicuro? Perché allora non è una parola chiave del compilatore? BTW, sono abbastanza sicuro che Boost lo avesse prima dei compilatori C++ 0x. –
Vedere commento aggiornato. – jrok