2012-11-03 9 views
7

Sto cercando di dichiarare il tipo di un puntatore di funzione "C" extern. È una variabile membro. La sintassi in this question Non riesco a ottenere la compilazione.Come dichiarare un membro come puntatore a una funzione "C" esterna?

template<typename Sig> struct extern_c_fp { 
    extern "C" typedef typename std::add_pointer<Sig>::type func_ptr_type; 
}; 

Ho sperimentato con dell'immissione extern "C" ad entrambe le estremità, e tra typedef e typename e tra type e func_ptr_type, ma il compilatore respinto tutti. Eventuali suggerimenti?

+0

Con i modelli di alias "extern" C ", funzionerebbe. http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#1463 –

+2

BTW Hai bisogno di 'Sig' per essere" extern "C" '. L'aggiunta del puntatore al tipo di funzione non ha il collegamento. È il tipo di funzione stesso. Si induce il collegamento quando si forma il tipo di funzione. Non quando si nomina un tipo di funzione esistente - quel tipo esistente ha il collegamento che ha. –

+0

http://liveworkspace.org/code/768027ef00bb0a31e76d8d856ac50801 Si lamenta di meno, ma è ancora problematico. – Puppy

risposta

1
extern "C" { 
    template<typename R, typename... Args> 
    using extern_c_fp = R(*)(Args...); 
} 

using my_function_ptr = extern_c_fp<void, int, double>; 
// returns void, takes int and double 

Questo non usa la stessa interfaccia, come si usa, ma ci può essere un modo per estrarre il tipo di ritorno e tipi di argomenti Sig.

Questo funziona in clang 3.1. Xeo ha sottolineato it didn’t work in GCC. Non sono sicuro che questo sia un bug in entrambi i compilatori, quindi fai attenzione quando lo usi.

0

Non è possibile dichiarare un typedef del genere (da 7.5p4):

Un leveraggio-specifica sono effettuate solo in ambito namespace (3.3).