Указатель на функцию в качестве нетипичного параметра шаблона - PullRequest
1 голос
/ 12 октября 2011

В настоящее время я портирую 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 + становится более сложной, это было бы адом для определения каждого SimpleMethod для каждого типа функции GTK +, например:

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 голосов
/ 12 октября 2011

Вы можете определить количество перегрузок на основе количества аргументов, например:

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 аргументы шаблона variadic должны сделать это намного проще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...