2012-11-03 9 views
7

Ich bin auf der Suche nach dem Typ eines externen "C" -Funktionszeigers. Es ist eine Mitgliedsvariable. Die Syntax in this question kann ich nicht kompilieren.Wie deklariere ich ein Mitglied als Zeiger auf eine externe "C" -Funktion?

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

Ich habe mit Anordnen des extern "C" experimentierten an beiden Enden und zwischen typedef und typename und zwischen type und func_ptr_type, aber der Compiler alle abgelehnt. Irgendwelche Vorschläge?

+0

Mit 'externen" C "' Alias ​​Vorlagen würde dies funktionieren. http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#1463 –

+2

BTW Du brauchst 'Sig' um' extern' C "' zu sein. Der Zeigerzusatz zum Funktionstyp hat die Verknüpfung nicht. Es ist der Funktionstyp selbst. Sie induzieren die Verknüpfung bei der Bildung des Funktionstyps. Nicht bei der Benennung eines vorhandenen Funktionstyps - der vorhandene Typ hat die Verknüpfung, die er hat. –

+0

http://liveworkspace.org/code/768027ef00bb0a31e76d8d856ac50801 Es klagt weniger, aber immer noch problematisch. – Puppy

Antwort

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 

Diese verwendet nicht die gleiche Schnittstelle wie Sie verwenden, aber es kann ein Weg sein, um den Rückgabetyp und Argumenttypen von Sig zu extrahieren.

Dies funktioniert in Clang 3.1. Xeo wies auf it didn’t work in GCC hin. Ich bin mir nicht sicher, ob das ein Fehler in beiden Compiler ist, also seien Sie vorsichtig, wenn Sie dies verwenden.

0

Sie können keine typedef wie die (von 7.5p4) erklärt:

Eine Verknüpfung-Spezifikation nur im Namensraum Umfang auftreten wird (3.3).

Verwandte Themen