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<S*>) (int)’
有趣的是,如果S
不接受任何参数,std::function<S*()>
会毫无怨言地分配给boost::factory
。为什么这不起作用?是否有解决方法允许将boost::factory
分配给std::function
?我正在使用 Boost.1.53
【问题讨论】:
【参考方案1】:似乎boost::factory<S*>
坚持将其参数绑定到引用:
boost::factory<S*> factory;
factory(17); // error
int argument(17);
factory(argument); // OK
基于此,boost::function<S*(int)>
似乎将参数作为int
传递而没有完美转发,而std::function<S*(int)>
似乎对参数使用完美转发。因此,参数不能绑定到boost::factory<S*>
参数。
当使用gcc 的std::function<...>
通过const&
传递参数时有效:
std::function<S*(int const&)> factory = boost::factory<S*>();
不幸的是,同样的解决方法不适用于 libc++ 中的 std::function<...>
。既然您说您尝试使用 gcc 编译代码,这可能不是什么大问题。
【讨论】:
以上是关于boost::factory 和 std::function的主要内容,如果未能解决你的问题,请参考以下文章