在boost::bind
的对话中,有人注意到C ++ 03中存在std::bind1st
,但它“几乎无法使用”。
我找不到任何可靠的支持。
The boost::bind
documentation说:
boost :: bind 是一个概括 标准函数 std :: bind1st 和 的的std :: bind2nd 即可。它支持任意 功能对象,功能,功能 指针和成员函数 指针,并能够绑定任何 特定值或路线的参数 将参数输入任意 位置。 绑定不会放置任何内容 对功能对象的要求; 特别是,它不需要 result_type , first_argument_type 和 second_argument_type 标准 类型定义
或许建议这些限制做适用于std::bind1st
。
除了对参数数量的明显限制之外, <{1}}对boost::bind
/ std::bind1st
的优势是什么?在C ++ 03中std::bind2nd
“几乎无法使用”的断言是否有任何优点?
答案 0 :(得分:7)
如果我们看一下C ++ 03 20.3.6.1和20.3.6.2,那么我们看到对于bind1st
的仿函数参数,我们需要三个typedef
s(对于结果类型) ,第一个和第二个参数),结果运算符只接受一个参数。
这意味着我们不能简单地在普通函数指针上使用bind1st
,因为它们没有那些typedef
。此外,我们只能对二进制函数使用bind1st
,因为我们不支持更多参数。此外,boost::bind
等具有能够重新排序参数的优势,当然还支持不仅仅是第一个参数。
在我看来,绑定器的大多数用例是自由函数和成员函数,而不是函子对象;因此bind1st
的使用非常有限(虽然可以通过使用ptr_fun
之类的其他工具进行扩展,但这是否会使其更有用是值得怀疑的。当然,这只是基于个人经验,但有人可能想要为bind1st
执行Google代码搜索统计。
答案 1 :(得分:2)
bind1st
返回的类型的函数调用运算符是
typename Operation::result_type
operator()(const typename Operation::second_argument_type& x) const;
这不适用于绑定函数对象的引用参数和非常严格的C ++ 03编译器(更新版本更宽松)。 C ++ 03禁止引用引用。