2012-01-10 10 views
10

Ho una semplice classe RAII per garantire che qualche handle sia correttamente smaltito. Ora vorrei affermare che nessuno aggiungerà per caso metodi virtuali ad esso. Per come la vedo io, devo affermare che la classe non ha il puntatore vtbl.Come affermare che una determinata classe non ha alcun puntatore vtbl nel suo layout?

Come posso farlo? È possibile affermare al momento della compilazione?

EDIT

mi accontenterò di compilatori desktop. Per quanto ne so non ci sono compilatori C++ desktop che non utilizzano vtbl per implementare il polimorfismo.

+0

In teoria, non è possibile farlo in modo portatile. –

+0

Potresti essere interessato a ottenere una classe _sealed_: http://stackoverflow.com/q/4712992/96780 –

+2

Il vtbl è un dettaglio di implementazione. Potrebbe esistere un compilatore che non utilizza le tabelle di chiamata per implementare funzioni virtuali. Vuoi limitarti a uno specifico compilatore? – filmor

risposta

19

Se si dispone di una libreria C++ 11, è possibile utilizzare std::is_polymorphic<T>:

Se T è una classe polimorfica (cioè una classe che dichiara o eredita almeno una funzione virtuale), fornisce la valore costante membro uguale vero. Per qualsiasi altro tipo, il valore è falso.

+0

Mi picchia, +1. – jrok

+1

+1, bello! Anche se non hai C++ 11 e hai Visual C++ c'è '__is_polymorphic' - http://msdn.microsoft.com/en-us/library/ms177194%28v=VS.90%29.aspx – sharptooth

+0

Nice . Mi piacerebbe che avessero introdotto più informazioni di tipo statico/funzionalità di riflessione in C++ 11 (come un modo per ottenere un elenco di campi/metodi per una classe). Ciò renderebbe molto più facile la creazione di meta-codice come wrapper per i linguaggi di scripting. – Kos

Problemi correlati