W jaki sposób można wdrożyć std::has_virtual_destructor
i podobne kontrole? Próbowałem, patrząc na nagłówek type_traits
w Visual Studio, ale jest zbyt wiele makr i szablonów, aby uzyskać nawet pomysł. Czy ta kontrola może być wyrażona w rozsądnie prostej formie? Chciałbym przynajmniej znać zasadę jego działania, ponieważ w tej chwili nie mam pojęcia.W jaki sposób zaimplementowano std :: has_virtual_destructor?
Odpowiedz
Wiele cech typu wymaga magii kompilatora: cechy w zasadzie udostępniają interfejs biblioteczny niektórym haczykom dostarczanym przez różne kompilatory. Sposób, w jaki kompilatory implementują te haki, zależy wyłącznie od nich i nie ma spójnego interfejsu.
Podczas bieżącego spotkania odbyła się dyskusja nad dodaniem refleksji do przyszłej wersji, która może ostatecznie doprowadzić do wdrożenia biblioteki, jeśli cechy takie jak std::has_virtual_destructor<T>
. Jednak minie trochę czasu, zanim pojawi się coś w rodzaju refleksji.
Dlaczego nie standaryzowały interfejsu tych haczyków przez tak wiele lat? –
@VioletGiraffe Czy oni tego nie zrobili? – jrok
@VioletGiraffe: możesz uważać interfejs cech za haczyk. W praktyce producenci kompilatorów mają inne podejście do faktycznego wyświetlania funkcji i mimo, że wiele lat temu zapytałem o stworzenie spójnego interfejsu, dostawcy kompilatorów stwierdzili, że konieczność przestrzegania określonego podejścia byłaby zbyt ograniczająca. –
- 1. W jaki sposób __RTC_CheckEsp zaimplementowano?
- 2. W jaki sposób zaimplementowano HttpSession?
- 3. W jaki sposób zaimplementowano strukturę izolacji Moles?
- 4. W jaki sposób zaimplementowano C# Generics?
- 5. W jaki sposób zaimplementowano pierwiastek kwadratowy?
- 6. W jaki sposób zaimplementowano funkcję numpy.cov()?
- 7. W jaki sposób zaimplementowano kursor bazy danych Android w szczegółach?
- 8. W jaki sposób zaimplementowano metodę synchronizowaną na AnyRef?
- 9. W jaki sposób zaimplementowano metodę ustawiającą zatrzymanie za pomocą @synthesize?
- 10. W jaki sposób zaimplementowano filtr wyłączania programu Photoshop?
- 11. W jaki sposób zaimplementowano ruby na szynach has_many (i podobne)?
- 12. W jaki sposób zaimplementowano metodę String # # języka Java?
- 13. W jaki sposób zaimplementowano wartości() dla Java 6?
- 14. W jaki sposób wdraża się std :: tuple?
- 15. W jaki sposób można użyć std :: bind?
- 16. W jaki sposób std :: set wolniej niż std :: map?
- 17. W jaki sposób std :: stringstream może ustawić bit fail/bad?
- 18. W jaki sposób C++ std :: mutex łączy się z zasobem?
- 19. W jaki sposób powinniśmy wdrożyć API kompatybilne ze std :: error_code?
- 20. W jaki sposób std: string uniemożliwia mi niedbale tupiąc dane?
- 21. W jaki sposób implementowany jest ciąg std :: string?
- 22. W jaki sposób "przy użyciu std :: swap" włączyć ADL?
- 23. W jaki sposób std :: unique_ptr nie ma narzutów rozmiaru?
- 24. W jaki sposób std :: nextafter() w C++ 11 może generować mniejsze wartości niż std :: numeric_limits :: min?
- 25. Jaki jest najlepszy sposób blokowania wielu std :: mutex'es?
- 26. jaki sposób std :: skopiować pracę z iteratorów strumienia
- 27. OpenCV Python: Draw minAreaRect (RotatedRect nie zaimplementowano)
- 28. W jaki sposób kontenery STL kopiują obiekty?
- 29. Jak zasygnalizować "nie zaimplementowano jeszcze"?
- 30. Czy w TensorFlow zaimplementowano rzadkie mnożenie tensorów?
To magia kompilatora. Nie można tego zaimplementować w standardowym C++. Boost zapewnia tę klasę cech i używa specyficznych dla kompilatora właściwości. Sprawdź [ten nagłówek] (http://www.boost.org/doc/libs/1_53_0/boost/type_traits/intrinsics.hpp). – jrok
@jrok: jesteś pewien? Dlaczego zatem nie jest to słowo kluczowe kompilatora? BTW, jestem prawie pewien, że Boost miał to przed kompilatorami 0x ++. –
Zobacz zaktualizowany komentarz. – jrok