如何使用boost :: bind将静态成员函数绑定到boost :: function

时间:2016-06-02 05:32:33

标签: c++ boost

我想使用boost :: bind将静态成员函数绑定到boost :: function。以下是我想做的事情(不工作)的例子。

class Foo {
public:
    static void DoStuff(int param)
    {
        // To do when calling back
    }
};


class Question {
public:
    void Setup()
    {
        AssignCallback(boost::bind(&Foo::DoStuff, _1));  // How to bind the static funciton here
    }

    void AssignCallback(boost::function<void(int param)> doStuffHandler)
    {
        ...
        ...
    }
};

我之前使用过这种语法的boost :: bind和成员函数:

boost::bind(&Foo::NonStaticMember, this, _1, _2, _3, _4)

但对于静态成员来说,这显然是不正确的。

请告诉我如何使用boost :: bind?

正确绑定类的静态成员函数

2 个答案:

答案 0 :(得分:3)

将像正常功能绑定一样完成。 对于静态函数,您只需要使用其类名来识别编译器的函数并跳过此参数,因为静态finctions绑定到类而不是对象。 以下是一个简单的例子:

#include <iostream>
#include <boost/function.hpp>
#include <boost/bind.hpp>
void test(boost::function<bool(int, int)> func)
{
    std::cout<<"in test().\n";
    bool ret = func(10, 20);
    std::cout<<"Ret:"<<ret<<"\n";
}
class Test
{
    public:
    static bool test2(int a, int b)
    {
            std::cout<<"in test2().\n";
            return a>b;
    }
};

int main()
{
    test(boost::bind(&Test::test2, _1, _2));
    return 0;
}

O/P:
in test().
in test2().
Ret:0

你不应该使用它作为静态函数没有这个指针。

int main()
{
    test(boost::bind(&Test::test2, this, _1, _2));-----> Illegal
    return 0;
}
Below error will occur:
techie@gateway1:myExperiments$ g++ boost_bind.cpp
boost_bind.cpp: In function âint main()â:
boost_bind.cpp:26: error: invalid use of âthisâ in non-member function

希望这会有所帮助。 : - )

答案 1 :(得分:1)

您的代码是正确的。也许您遇到一些编译器问题?你能引用编译输出吗?

您也可以尝试使用std :: function和std :: bind。只能用&#34; functional&#34;替换boost标头。标题和写

std::placeholders::_1

而不是

_1