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

Lig*_*ica 4 c++ std boost-bind

在谈话期间boost::bind,有人注意到它std::bind1st存在于C++ 03中,但它"几乎无法使用".

我找不到任何可靠的支持.

boost::bind文件说:

boost :: bind是标准函数std :: bind1ststd :: bind2nd的泛化.它支持任意函数对象,函数,函数指针和成员函数指针,并且能够将任何参数绑定到特定值或将输入参数路由到任意位置.bind不对函数对象提出任何要求; 特别是,它不需要 result_type,first_argument_typesecond_argument_type标准typedef.

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

比对参数的数目明显的限制,还有什么优势boost::bind,以std::bind1st/ std::bind2ndstd::bind1st在C++ 03中"几乎无法使用" 的断言是否有任何优点?

Pla*_*aHH 7

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

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

在我看来,绑定器的大多数用例是自由函数和成员函数,而不是函子对象; 因此,使用bind1st非常有限(虽然可以通过使用其他工具进行扩展ptr_fun,但是这是否使其更有用)是值得怀疑的.当然,这只是基于个人经验,但有人可能想要为其执行Google代码搜索统计bind1st.