2013-09-28 13 views
10

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?

+7

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

+0

@jrok: jesteś pewien? Dlaczego zatem nie jest to słowo kluczowe kompilatora? BTW, jestem prawie pewien, że Boost miał to przed kompilatorami 0x ++. –

+0

Zobacz zaktualizowany komentarz. – jrok

Odpowiedz

13

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.

+1

Dlaczego nie standaryzowały interfejsu tych haczyków przez tak wiele lat? –

+0

@VioletGiraffe Czy oni tego nie zrobili? – jrok

+0

@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. –

Powiązane problemy