2010-05-09 10 views
5

GCC fino a 4,5 non ha un modello di tratto di tipo C++ 0x standard has_nothrow_move_constructor. Potrei usarlo nel mio pacchetto per l'ottimizzazione, ma non voglio escludere uno dei comuni compilatori e non voglio sovraccaricare la configurazione con simboli come HAVE_STD_HAS_NOTHROW_MOVE_CONSTRUCTOR. È in qualche modo possibile utilizzare quel modello se presente e ricorrere alla copia se non presente senza utilizzando i simboli di configurazione predefiniti? Inoltre, non voglio dipendere da Boost, poiché la mia libreria è piccola e non ha bisogno di Boost per altri motivi.Rileva la presenza del modello al momento della compilazione

In pseudocodice, ho bisogno di qualcosa come:

template <typename type> 
struct has_nothrow_move_constructor_robust 
    : public integral_constant <bool, 
      /* if possible */ has_nothrow_move_constructor <type>::value 
      /* otherwise */ false> 
{ }; 

Dal costruttori mossa sono solo per C++ 0x in ogni caso, non mi dispiace con altri C++ 0x caratterizza per la definizione di cui sopra, se non del tutto possibile

+3

La maggior parte di Boost è implementata nei file di intestazione, non nei file oggetto. Quindi, se ti attieni a quelli, non paghi penalità di taglia per cose che non usi - né per la maggior parte delle cose che usi, del resto. –

+0

È più di avere una dipendenza (anche se quasi tutti usano Boost comunque). Forse potrei strappare la parte rilevante di Boost, ma dal momento che la mia libreria è come 3 intestazioni comunque ... – doublep

+0

Sembra abbastanza difficile controllare se esiste un tipo. Ma allora, se non esiste un costruttore di move, C++ 0x non ricadrà automaticamente automaticamente sulla copia? O se la parte di nothrow è importante, non è un po 'difficile immaginare una classe in cui copiare è più sicuro che muoversi (se quest'ultimo non è contrassegnato come nothrow)? – UncleBens

risposta

1

boost::variant ha un'implementazione di has_nothrow_move per il proprio uso interno - è possibile utilizzarlo, anche se non è affidabile come sarebbe una corretta implementazione del compilatore. La fonte è here - Non so quanto sia affidabile, quindi YMMV.

Oltre a ciò, è possibile eseguire il test delle macro della versione del compilatore (__GNUC__ and __GNUC_MINOR__) per determinare la presenza e arrestarla se non presente. Purtroppo sembra che has_nothrow_move_constructor non sia ancora supportato in nessuna versione rilasciata di G ++, quindi dovrai aspettare un po 'prima di conoscere la versione corretta da usare.

Problemi correlati