boost :: bind隐式转换为boost :: function或函数指针

时间:2013-04-09 07:02:13

标签: c++ boost boost-bind boost-function

我正在使用boost :: function,如下所示:

template<class T1>
void run(boost::function<void (T1)> func, string arg)
{
    T1 p1 = parse<T1>(arg);
    func(p1);
}

如果这样使用,一切都还可以:

void test1(int i)
{
    cout << "test1 i=" << i << endl;
}

...

boost::function<void (int)> f = &test1;
run(f, "42");

我希望能够直接传递原始函数指针,所以我重载了run()函数,如下所示:

template<class T1>
void run(void (*func)(T1), string arg)
{
    T1 p1 = parse<T1>(arg);
    (*func)(p1);
}

...

run(&test1, "42"); // this is OK now

现在,我希望能够将boost :: bind的结果传递给run()函数。像这样:

void test2(int i, string s)
{
    cout << "test2 i=" << i << " s=" << s << endl;
}

...

run(boost::bind(&test2, _1, "test"), "42"); // Edit: Added missing parameter 42

但是这不会编译:已编辑

bind.cpp: In function ‘int main()’:
bind.cpp:33:59: error: no matching function for call to ‘run(boost::_bi::bind_t<void, void (*)(int, std::basic_string<char>), boost::_bi::list2<boost::arg<1>, boost::_bi::value<std::basic_string<char> > > >, std::string)’
bind.cpp:33:59: note: candidates are:
bind.cpp:7:6: note: template<class T1> void run(boost::function<void(T1)>, std::string)
bind.cpp:14:6: note: template<class T1> void run(void (*)(T1), std::string)

我应该如何重载run()以接受boost :: bind()?

修改2

我知道我可以这样做:

boost::function<void (int)> f = boost::bind(&test2, _1, string("test"));
run(f, "42");

但我希望这种用法不那么冗长。

编辑3

将run {()原型从run(boost::function<void (T1)>, T1)更改为run(boost::function<void (T1)>, string)以详细说明实际用例。参考。伊戈尔回答

可以获取整个源文件here

1 个答案:

答案 0 :(得分:1)

functionbind的结果类型都不能转换为函数指针,因此您无法使用当前签名将它们传递给run函数。

但是,您可以更改run签名以允许其接受任何可调用

template<class F, class A1>
void run(F f, A1 arg)
{
  f(arg);
}

现在你可以传递一个指针函数,一个活页夹,boost::function或你想要的 callable - 只要它需要1个参数。 (但请注意,使用此微不足道的签名run将无法forward f {{1}}无效的参数。)