Boost :: Bind эквивалент в C? - PullRequest
1 голос
/ 12 ноября 2010

Я ищу что-то похожее на boost::bind в C ++, но в C. Я хочу иметь возможность:

bound_function = bind(my_function, some_param);

и имеют:

bound_function(something);

выполнить

myfunction(some_param, something);

Таким образом, все, что связано с указателем на функцию, всегда будет передаваться в качестве первого параметра функции.

Есть ли способ сделать это в C?

Не делайте этого дома, дети.

Ответы [ 3 ]

4 голосов
/ 12 ноября 2010

Вы не можете сделать это так, как это делает C ++, потому что в случае boost::bind класс генерируется с использованием TMP, который содержит фактическое значение привязки.

Я не знаю ни о какомспособ достичь чего-то подобного в C. Большинство API C с такими обратными вызовами пропустят void *, чтобы вы могли обойти подобные проблемы.

2 голосов
/ 12 ноября 2010

Самое близкое, что вы можете получить, это что-то вроде этого:

#include <stdio.h>
#include <stdlib.h>

typedef void (*function)(void*);

typedef struct {
    void *arg;
    function fn;
} binder;

binder *binder_create(function fn, void *arg) 
{
    binder *b = malloc(sizeof(binder));
    if (b) {
        b->fn = fn;
        b->arg = arg;
    }
    return b;
}

void binder_delete(binder *b)
{
    free(b);
}

void binder_exec(binder *b)
{
    b->fn(b->arg);
}

int main(void)
{
    binder *myfunc = binder_create((function)puts, "Hello, World!\n");
    binder_exec(myfunc);
    binder_delete(myfunc);
    return 0;
}

Это не дает вам вызов функции, подобный синтаксису (вам нужно вместо этого вызвать binder_exec), и вам, вероятно, потребуется создать несколько версий, которые принимают больше аргументов и аргументов разных типов.

1 голос
/ 12 ноября 2010

Одним словом, нет. С не имеет такого понятия.

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