2016-04-03 18 views
1

私はCとインターフェイスしていると言います。extern(C)関数リテラルを渡すにはどうしたらいいですか?

ここはインターフェイスへのラッピング機能です。

@property extern(C) void onEvent(void function(InterfaceStruct*, int, int, int) nothrow callback) 
{ 
     interfaceSetCallback(handle, callback); 
} 

すべていいです。

wrapper.onEvent = function void (InterfaceStruct*, int x, int y, int z) nothrow 
{ 
     if (x == 11) doSomething(); 
}; 

ええとああは:

Error: function foo.bar.onEvent (void function(InterfaceStruct*, int, int, int) nothrow callback) is not callable using argument types (void function(InterfaceStruct* _param_0, int x, int y, int z) nothrow @nogc @safe) 

だから、それは私が機能リテラルであることにextern(C)を持って望んでいます。だから私はどうすればいいのですか?私はそうする方法を見つけることができません。代わりに、自動的にそれを正しいタイプを割り当てます

wrapper.onEvent = (a, x, y, z) 
{ 
    if (x == 11) doSomething(); 
}; 

Dを使用してあなたは、単にのonEvent割り当てることができます全体の関数定義を提供する

答えて

3

また、extern(C)が実際には関数ポインタ定義に使用されていないため、コードでは実際には構文エラーが発生するはずです。

あなたは、代わりに関数ポインタ型の別名を定義し、このようにそれに割り当てをキャストすることができます:

alias EventCallback = extern(C) void function(InterfaceStruct*, int, int, int) nothrow; 

@property extern(C) void onEvent(EventCallback callback) 
{ 
     interfaceSetCallback(handle, callback); 
} 

// ... 

wrapper.onEvent = cast(EventCallback) function void(InterfaceStruct*, int x, int y, int z) nothrow 
{ 
     if (x == 11) doSomething(); 
}; 
+0

ねえ、ありがとう!関数ポインタやリテラルについて、あまりにも多くのオンラインを見つけることができませんでした。また、あなたが与えた2番目のオプションに感謝します。私はすでにそれについて知っていました(他のコードを見た後)が、私は可能な限りキャストを使用しません。幸いにも、今のところ、私はする必要はありません。 –

関連する問題