2012-12-27 11 views
8

Questa è una ripresa abbastanza lunga, poiché non sono sicuro che sia possibile, ma forse qualcuno più esperto di me nel modello metaprogrammazione mi illuminerà.Estrarre la convenzione di chiamata da un tipo di funzione usando il metaprogrammazione del modello in C++

sto scrivendo una funzione lua automatizzato sistema di rilegatura utilizzando i modelli, estraendo il tipo di funzione che utilizza la specializzazione parziale:

template<typename T, T FUNCTION> class Function_c; 
template<typename R, R (*FUNCTION)()> class Function_c<R (*)(), FUNCTION>; //specialized version 

Il problema è che questo non mi dire la funzione di convenzione di chiamata, quindi (in VS2012 32 bit) non verrà compilato per __stdcall e si bloccherà con __fastcall. Posso creare un'altra versione specializzata per affrontare con una particolare convenzione di chiamata, ad esempio:

template<typename R, R (__stdcall *FUNCTION)()> class Function_c<R (__stdcall *)(), FUNCTION>; 

Ma il numero di permutazioni sta cominciando a sfuggire di mano: 2 (funzioni globali & utente) volte il numero massimo di parametri volte il numero delle convenzioni di chiamata.

Quindi mi chiedo se c'è un modo per ottenere la convenzione di chiamata come parametro del modello (probabilmente non, dal momento che non è proprio un tipo) per ridurre la quantità di copypasting.

risposta

1

Quando si ha a che fare con questo tipo di parametro, ciò che si può fare è uno dei seguenti.

Aggiungere un parametro in più

Il modello sarà quindi simile a questa:

template < typename T, T function, typename CallType > class Function_c;

Si può facilmente nascondere la realtà spedizione all'interno del CallType, in tal modo si avrà solo bisogno di implementare uno classe per ogni tipo di chiamata.

Fai un involucro

Sto indovinando che la classe è già un oggetto wrapper, ma si può facilmente fare un passo avanti.

È possibile creare un wrapper per ognuno dei tipi di chiamata, è quindi possibile modificare il modello a:

template < typename T, typename Functor > class Function_c;

instanciating come questo: Function_c<int, WrapperStdCall<int (*)()> > x;

Problemi correlati