为什么std :: bind1st可能被认为“几乎无法使用”?

时间:2011-07-07 10:42:23

标签: c++ boost-bind std

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“几乎无法使用”的断言是否有任何优点?

2 个答案:

答案 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禁止引用引用。