2011-06-21 15 views
4

私は既存のCライブラリのいくつかのDバインディングに取り組んでいます。そして、私はたくさんの関数定義とそれらのバインディングを持っています。例:Dで可変数の文字列引数を持つミックス?

// Functions 
void function(int) funcA; 
long function() funcB; 
bool function(bool) funcC; 
char function(string) funcD; 
// etc... 

// Bindings 
if(!presentInLibrary("func")) return false; 
if(!bindFunction(funcA, "funcA")) return false; 
if(!bindFunction(funcB, "funcB")) return false; 
if(!bindFunction(funcC, "funcC")) return false; 
if(!bindFunction(funcD, "funcD")) return false; 
// etc... 

このモデルは、DerelictがOpenGL拡張機能をどのように処理するかと非常によく似ています。しかし、これは余分なタイピングのように思える。上記のような「束縛」部分を表現する方法が本当に好きです:

BINDGROUP("func", "funcA", "funcB", "funcC", "funcD", ...); // Name of function group, then variable list of function names. 

これはミックスインでできますか?

答えて

5

ループ:

dl_open()からポインタを返す

a = cast(typeof(a))lib.getSymbol("a"); 
b = cast(typeof(b))lib.getSymbol("b"); 
c = cast(typeof(c))lib.getSymbol("c"); 

は、この情報がお役に立てば幸い:ここ

void function() a; 
int function(int) b; 
void function(string) c; 

string bindFunctions(string[] funcs...) 
{ 
    string ret; 
    foreach (func; funcs) 
    { 
     ret ~= func ~ ` = cast(typeof(` ~ func ~ `))lib.getSymbol("` ~ func ~ `");`; 
    } 
    return ret; 
} 
mixin(bindFunctions("a", "b", "c")); 

のようなものに見える文字列を返します。

+0

私はそれを突き詰めなければなりませんが、通常の静的foreachを使用して文字列の混合を行わずにこの作業を行うことができるはずですfuction。正しい範囲からバインドするには、テンプレートミックスインを使用する必要があります。 – BCS

4

あなたは文字列mixinsを意味すると思いますか?あなたも行うことができ、これはあなたが私がここに再帰的なテンプレート宣言を使用してい

template BINDGROUP(string group,T...){ 
    alias BINDGROUP presentInLibrary("func") && BINDGROUPFUNCS!(T); 
} 

template BINDGROUPFUNCS(T...){ 
    static if(T.length)alias BINDGROUPFUNCS true; // all is successful 
    else alias BINDGROUPFUNCS bindFunction(mixin(T), T) && BINDGROUPFuncts!(T[1..$]); 
} 

探しているもので、私は信じてい

string BINDGROUP(string functionGroup, string[] functions...) 
{ 
    // ... 
} 

mixin(BINDGROUP("func", "funcA", "funcB", "funcC", "funcD")); 
+0

私は、コンパイル時に文字列を知っていて、文字列varargを持っていなければならないので、これはうまくいかないという印象を受けました。それが事実でない場合、私は間違いなくこれを行うでしょう! (また、はい、私は文字列ミックスインを意味し、説明のためにあなたに感謝します)。 –

+0

@markコンパイラは( 'enum'または' mixin'を用いて)コンパイルを完了し、計算できないときにエラーを投げるために結果が必要な場合、コンパイル時に弱く純粋な関数を計算しようとします。 varargs(とテンプレートargs)はコンパイル時に展開されます。 –

4

:あなただけD'sの可変引数構文のストレートフォワード利用することができますforeachのとこれは私が動的ロードをしていたとき、私はそれがあなたの質問に答えていませんが、あなたがそれを適応させることができるかもしれない、これを使用し

関連する問題