我目前正在将GTK +移植到动态语言中,其中一个挑战是将GTK +函数转换为语言绑定。我尝试使用C ++模板来简化它。
例如,要将'gtk_widget_show_all'转换为动态语言的'show_all',我首先定义以下泛型函数:
template<class Type, class GtkType, void function (GtkType*)>
static Handle<Value> SimpleMethod (const Arguments& args) {
GtkType *obj = blablabla...;
function (obj);
return Undefined ();
}
然后我可以很容易地将'gtk_widget_show_all'绑定到'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) {
...
}
它会变得相当恶心。有没有一种方法可以将这些功能简化为一个功能?
答案 0 :(得分: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可变参数模板参数应该使这更容易。