2012-01-10 10 views
10

Mam prostą klasę RAII, aby upewnić się, że jakiś uchwyt jest odpowiednio usuwany. Teraz chciałbym stwierdzić, że nikt nie doda przypadkowo żadnych wirtualnych metod. Sposób, w jaki to widzę, muszę stwierdzić, że klasa nie ma wskaźnika vtbl.Jak stwierdzić, że dana klasa nie ma żadnych wskaźników vtbl w swoim układzie?

Jak mogę to zrobić? Czy można to potwierdzić w czasie kompilacji?

EDIT

będę zadowalać kompilatorów stacjonarnych. O ile mi wiadomo, nie ma kompilatorów C++, które nie używają vtbl do implementacji polimorfizmu.

+0

Teoretycznie nie można tego zrobić w przenośny sposób. –

+0

Być może zainteresuje Cię klasa _sealed_: http://stackoverflow.com/q/4712992/96780 –

+2

vtbl jest szczegółem implementacji. Może istnieć kompilator, który nie używa tabel wywołań do implementacji funkcji wirtualnych. Czy chcesz ograniczyć się do jednego konkretnego kompilatora? – filmor

Odpowiedz

19

Jeśli masz C++ 11 biblioteki, można użyć std::is_polymorphic<T>:

Jeśli T jest polimorficzny klasy (to jest klasa, która deklaruje lub dziedziczy co najmniej jedną funkcję wirtualną), dostarcza stała członu wartość równa true. Dla każdego innego typu wartość to fałsz.

+0

Pokonaj mnie, +1. – jrok

+1

+1, miłe! Również jeśli nie masz C++ 11 i masz Visual C++, jest '__is_polymorphic' - http://msdn.microsoft.com/en-us/library/ms177194%28v=VS.90%29.aspx – sharptooth

+0

Nice . Szkoda, że ​​nie wprowadzili więcej funkcji statycznych typu info/reflect w C++ 11 (jak sposób na uzyskanie listy pól/metod dla klasy). Ułatwiłoby to znacznie tworzenie meta-kodu, takiego jak wrappery dla języków skryptowych. – Kos

Powiązane problemy