boost::factory 和 std::function

Posted

技术标签:

【中文标题】boost::factory 和 std::function【英文标题】:boost::factory and std::function 【发布时间】:2013-11-04 23:31:51 【问题描述】:

我正在尝试在 gcc 4.7.2 上将一些代码转换为 C++11。部分代码包括将boost::factory 分配给boost::function。但是,如果我将其更改为 std::function,编译将失败并出现大量警告。这是重现错误的示例代码:

#include <boost/functional/factory.hpp>
#include <boost/function.hpp>
#include <functional>

struct S 
  S(int) 
;

int main() 

  boost::function<S*(int)> b = boost::factory<S*>(); // ok

  std::function<S*(int)> s = boost::factory<S*>();   // error

这给了error: no match for call to ‘(boost::factory&lt;S*&gt;) (int)’

有趣的是,如果S 不接受任何参数,std::function&lt;S*()&gt; 会毫无怨言地分配给boost::factory。为什么这不起作用?是否有解决方法允许将boost::factory 分配给std::function?我正在使用 Boost.1.53

【问题讨论】:

【参考方案1】:

似乎boost::factory&lt;S*&gt; 坚持将其参数绑定到引用:

boost::factory<S*> factory;

factory(17); // error

int argument(17);
factory(argument); // OK

基于此,boost::function&lt;S*(int)&gt; 似乎将参数作为int 传递而没有完美转发,而std::function&lt;S*(int)&gt; 似乎对参数使用完美转发。因此,参数不能绑定到boost::factory&lt;S*&gt; 参数。

当使用gcc 的std::function&lt;...&gt; 通过const&amp; 传递参数时有效:

std::function<S*(int const&)> factory = boost::factory<S*>();

不幸的是,同样的解决方法不适用于 libc++ 中的 std::function&lt;...&gt;。既然您说您尝试使用 gcc 编译代码,这可能不是什么大问题。

【讨论】:

以上是关于boost::factory 和 std::function的主要内容,如果未能解决你的问题,请参考以下文章

可变参数模板模板和完美转发

std::function()函数std::bind()函数以及lambda

clang++ mac os x c++11 链接器问题

C ++ Boost库 - 将共享指针传递给函数

& 和 && 区别和联系,| 和 || 区别和联系

第三十一节:扫盲并发和并行同步和异步进程和线程阻塞和非阻塞响应和吞吐等