我正试图在一些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!");
}
答案 0 :(得分:4)
bind
的结果类型不是函数指针,它是一个函数 object ,它不会隐式转换为函数指针。使用模板:
template<typename ToRunT>
void runit(ToRunT const& torun, std::string const& message)
{
torun(message);
}
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!"));