如何将boost :: bind与C函数指针混合以实现回调

时间:2011-07-07 20:52:17

标签: c++ boost

我正试图在一些boost :: bind中替换成直接C函数指针样式回调的替换成员函数,但是我遇到了明显的问题。有人能告诉我为什么下面的代码片段似乎无法匹配函数调用中的类型吗?

#include <iostream>
#include <boost/bind.hpp>

using namespace std;

class Foo {
public:
  Foo(const string &prefix) : prefix_(prefix) {}
  void bar(const string &message)
  {
    cout << prefix_ << message << endl;
  }
private:
  const string &prefix_;
};

static void
runit(void (*torun)(const string &message), const string &message)
{
  torun(message);
}

int
main(int argc, const char *argv[])
{
  Foo foo("Hello ");
  runit(boost::bind<void>(&Foo::bar, boost::ref(foo), _1), "World!");
}

4 个答案:

答案 0 :(得分:4)

bind的结果类型不是函数指针,它是一个函数 object ,它不会隐式转换为函数指针。使用模板:

template<typename ToRunT>
void runit(ToRunT const& torun, std::string const& message)
{
    torun(message);
}

或使用boost::function<>

static void runit(boost::function<void(std::string const&)> const& torun,
                  std::string const& message)
{
    torun(message);
}

答案 1 :(得分:2)

使用模板,而不是为runit的第一个参数设置特定的函数指针签名。例如:

template<typename function_ptr>
void runit(function_ptr torun, const string &message)
{
  torun(message);
}

答案 2 :(得分:1)

你可以对boost :: bind对象使用boost :: function类型

答案 3 :(得分:0)

粘贴你得到的错误可能很有用;但是,猜测可能是因为"World!"是一个字符串文字(即char[]),而不是std::string。尝试:

runit(boost::bind<void>(&Foo::bar, boost::ref(foo)), std::string("World!"));