4

在关于 的对话中boost::bind,有人注意到它std::bind1st存在于 C++03 中,但它“几乎无法使用”。

我找不到任何可靠的东西来支持这一点。

boost::bind文档

boost::bind是标准函数std::bind1ststd::bind2nd的泛化。它支持任意函数对象、函数、函数指针和成员函数指针,并且能够将任何参数绑定到特定值或将输入参数路由到任意位置。bind对函数对象没有任何要求;特别是,它不需要 result_typefirst_argument_typesecond_argument_type标准类型定义。

也许暗示这些限制确实适用于std::bind1st.

除了对参数数量的明显限制之外, to /优点是什么?在 C++03 中“几乎不可用”的断言有什么优点吗?boost::bindstd::bind1ststd::bind2ndstd::bind1st

4

2 回答 2

7

如果我们查看 C++03 20.3.6.1 和 20.3.6.2,那么我们会看到对于 functor 参数,bind1st我们需要三个typedefs(对于结果类型,第一个和第二个参数),并且结果运算符只有接受一个论点。

这意味着我们不能bind1st轻易地在普通函数指针上使用,因为它们没有那些typedefs。此外,我们只能bind1st在二进制函数上使用,因为我们不支持更多参数。此外, boost::bind et al具有能够对参数重新排序的优势,当然支持的不仅仅是第一个。

在我看来,绑定器的大多数用例是用于自由函数和成员函数,而不是用于仿函数对象。因此使用bind1st是非常有限的(虽然可以通过使用其他工具来扩展ptr_fun,但它是否使它更有用是值得怀疑的)。当然这只是基于个人经验,但有人可能想对bind1st.

于 2011-07-07T10:56:37.407 回答
2

bind1st返回类型的函数调用运算符是

typename Operation::result_type
operator()(const typename Operation::second_argument_type& x) const;

这不适用于绑定函数对象的引用参数和非常严格的 C++03 编译器(最近的版本更加宽松)。C++03 禁止引用引用。

于 2011-07-07T11:18:06.797 回答