2011-10-12 14 views
1

私は現在GTK +を動的言語に移植していますが、GTK +関数を言語バインディングに変換することが課題の1つです。私はC++テンプレートを使ってそれを単純化しようとしています。ノンタイプのテンプレートパラメータとしての関数ポインタ

例えば、動的言語の「SHOW_ALL」から「gtk_widget_show_all」を変換するために、私は最初に、一般的な機能以下の定義:

template<class Type, class GtkType, void function (GtkType*)> 
static Handle<Value> SimpleMethod (const Arguments& args) { 
    GtkType *obj = blablabla...; 

    function (obj); 

    return Undefined(); 
} 

その後、私は非常に簡単に「SHOW_ALL」から「gtk_widget_show_all」をバインドすることができます。

は、
NODE_SET_PROTOTYPE_METHOD (constructor_template, "show_all", (SimpleMethod<Widget, GtkWidget, gtk_widget_show_all>)); 

しかし、GTK +の機能がより複雑になったとき、それはこのように、GTK +機能のすべての種類ごとSimpleMethodを定義するための地獄のようになります。

template<class Type, class GtkType, void function (GtkType*, const char *)> 
static Handle<Value> SimpleMethod (const Arguments& args) { 
    ... 
} 

template<class Type, class GtkType, void function (GtkType*, int)> 
static Handle<Value> SimpleMethod (const Arguments& args) { 
    ... 
} 

template<class Type, class GtkType, int function (GtkType*)> 
static Handle<Value> SimpleMethod (const Arguments& args) { 
    ... 
} 

template<class Type, class GtkType, void function (GtkType*, const char *, const char *)> 
static Handle<Value> SimpleMethod (const Arguments& args) { 
    ... 
} 

かなり嫌になる。これらの関数を1つの関数に単純化する良い方法はありますか?

+0

C++を使用している場合は、GTK + [gtkmm](http://www.gtkmm.org/en/)に既存のC++ラッパーを使用しないのはなぜですか? –

+0

@ another.anon.coward gtkmmは多くのC++機能を追加しますが、GTK +は他の言語にバインドされるように設計されています。 – fool

答えて

0

あなたはこのように、引数の数に基づいて、オーバーロードの数を定義することができます。

template<class Type, class GtkType, class ReturnType, ReturnType function()> 
static Handle<Value> SimpleMethod (const Arguments& args) { 
    ... 
} 

template<class Type, class GtkType, class ReturnType, class Arg0, ReturnType function(Arg0)> 
static Handle<Value> SimpleMethod (const Arguments& args) { 
    ... 
} 

...and so on... 

Boost.Preprocessorはあなたがオーバーロードを生成するに役立つだろう。 C++ 11のバリデーションテンプレート引数はこれをもっと簡単にするはずです。

+0

あなたのアイデアは良いですが、 'function(Arg0、Arg1、...)'のような任意の長い関数呼び出しを生成するためにC++ 11バリデーションテンプレート引数を使用することは可能ですか? – fool

+0

@fool:おそらく、余分なテンプレートマジックを使っていると思いますが、私のコンパイラはまだそれらをサポートしていないので、わかりません。 –

関連する問題