我编写了一些代码,使用仿函数和来自ref
或bind
的{{1}}和boost::
模板来计算向量的元素数量(对于C + +11)名称空间。我正在使用std::
在#define
和boost::
命名空间之间切换。我正在使用boost版本1.53,我的编译命令是std::
。我已经尝试使用gcc版本4.7.2和4.6.3,但我得到了相同的错误。
我有3个问题:
g++ test.cpp -std=c++11
,std
和boost
的{{1}}和bind
版本之间的差异? (我看到了this个问题,但答案没有提到ref
或function
)谢谢!
P.S。该示例只是说明了我的问题,我知道ref
的{{1}}: - )
function
答案 0 :(得分:4)
示例2失败,因为boost::reference_wrapper
没有member operator()
which forwards the argument(s),与std::reference_wrapper
不同。因此,它仅用于通过引用传递普通参数,而不是期望被调用的函数或函子。
示例3失败,因为Boost.Bind relies on a specific protocol to get the result type of the function or functor you pass,如果您使用没有显式返回类型的版本。如果传递指向函数的指针或指向成员函数的指针,则返回绑定器对象将嵌套result_type
设置为所述PTF或PTMF的返回类型。如果你传递一个仿函数,它需要一个嵌套的result_type
另一方面,如果您的仿函数没有嵌套std::bind
,则result_type
根本就没有嵌套boost::bind
。
请注意,正如我所说,您可以向std::bind
和std::for_each(vec.begin(), vec.end(), impl::bind<void>(impl::ref(f3), _1));
// ^^^^^^
明确提供结果类型:
{{1}}
修复了示例并使其编译。
答案 1 :(得分:2)
std::ref
相比,{p> boost::ref
有一个主要优势:它提供了一个完美转发{/ 1}},它会将调用转发到其包含的引用。
operator()
实际上无法做到这一点,因为它需要大量的重载。但是,为了实现这一点,boost::ref
(以及其他一些类)都为boost::bind
提供了特殊处理。