c ++ универсальный указатель на функцию (member?) - PullRequest
2 голосов
/ 20 мая 2010

Я не могу объявить общий указатель на функцию.

Наличие этих 2 функций для вызова:

void myfunc1(std::string str)
{
    std::cout << str << std::endl;
}
struct X
{
        void f(std::string str){ std::cout<< str << std::endl;}
};

и эти две функции:

typedef void (*userhandler_t) (std::string);
struct example
{   
    userhandler_t userhandler_;

    example(userhandler_t userhandler): userhandler_(userhandler){}

    void call(std::string str)
    {   
        userhandler_(str);
    }
};
template<typename func_t>
void justfunc(func_t func)
{
    func("hello, works!");
}

когда я пытаюсь использовать их с boost :: bind для вызова функции-члена, они дают мне ошибки компиляции.

это работает:

example e1(&myfunc1);
e1.call("hello, world!");
justfunc(&myfunc1);

это не так:

X x;
example e2(boost::bind(&X::f, &x, _1));
e2.call("hello, world2!");
justfunc(boost::bind(&X::f, &x, _1));

Как это должно быть сделано?

1 Ответ

7 голосов
/ 20 мая 2010

boost::bind создает объекты, которые ведут себя как функции, а не как фактические указатели функций.Используйте библиотеку Boost.Function для хранения результата вызова boost::bind:

struct example
{
    boost::function<void(std::string)> userhandler_;
    ...
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...