如何使用bind1st和bind2nd?

Art*_*hur 16 c++ binding stl

我想学习如何使用绑定函数.这是一个想法:我有这个参数的功能:

void print_i(int t, std::string separator)
{
        std::cout << t << separator;
}
Run Code Online (Sandbox Code Playgroud)

我想这样做:

std::vector<int> elements;
// ...
for_each(elements.begin(), elements.end(), std::bind2nd(print_i, '\n'));
Run Code Online (Sandbox Code Playgroud)

但它不起作用!

这是我得到的:

/usr/include/c++/4.3/backward/binders.h: In instantiation of ‘std::binder2nd<void ()(int, std::string)>’:
main.cpp:72:   instantiated from here
/usr/include/c++/4.3/backward/binders.h:138: error: ‘void ()(int, std::string)’ is not a class, struct, or union type
/usr/include/c++/4.3/backward/binders.h:141: error: ‘void ()(int, std::string)’ is not a class, struct, or union type
/usr/include/c++/4.3/backward/binders.h:145: error: ‘void ()(int, std::string)’ is not a class, struct, or union type
/usr/include/c++/4.3/backward/binders.h:149: error: ‘void ()(int, std::string)’ is not a class, struct, or union type
/usr/include/c++/4.3/backward/binders.h:155: error: ‘void ()(int, std::string)’ is not a class, struct, or union type
/usr/include/c++/4.3/backward/binders.h:140: error: field ‘std::binder2nd<void ()(int, std::string)>::op’ invalidly declared function type
/usr/include/c++/4.3/backward/binders.h: In function ‘std::binder2nd<_Operation> std::bind2nd(const _Operation&, const _Tp&) [with _Operation = void ()(int, std::string), _Tp = char]’:
main.cpp:72:   instantiated from here
/usr/include/c++/4.3/backward/binders.h:164: error: ‘void ()(int, std::string)’ is not a class, struct, or union type
/usr/include/c++/4.3/bits/stl_algo.h: In function ‘_Funct std::for_each(_IIter, _IIter, _Funct) [with _IIter = __gnu_cxx::__normal_iterator<int*, std::vector<int, std::allocator<int> > >, _Funct = std::binder2nd<void ()(int, std::string)>]’:
main.cpp:72:   instantiated from here
/usr/include/c++/4.3/bits/stl_algo.h:3791: error: no match for call to ‘(std::binder2nd<void ()(int, std::string)>) (int&)’
make: *** [all] Error 1
Run Code Online (Sandbox Code Playgroud)

我可以使用仿函数,但使用绑定更快.

谢谢!

小智 26

您需要使用Copyable/Refrencable对象,以下工作:

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <functional>

void print_i(int t, std::string separator)
{
   std::cout << t << separator;
}

int main()
{
   std::vector<int> elements;
   std::string delim = "\n";
   for_each(elements.begin(), 
            elements.end(),
            std::bind2nd(std::ptr_fun(&print_i),delim));
   return 0;
}

通常只需执行以下操作即可获得相同的效果:

#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>

int main()
{
   std::vector<int> elements;
   std::copy(elements.begin(),
             elements.end(),
             std::ostream_iterator<int>(std::cout,"\n"));
   return 0;
}

假设你在你正在使用的STL中访问TR1,它总是最好修改/替换bind1st和bind2nd与std :: bind的任何用法


Rüd*_*nke 11

bind2nd必须是一个论点AdaptableBinaryFunction.普通的二进制函数不满足此要求(自适应函数需要typedef用于其返回和参数类型,普通函数类型不提供任何typedef).std::bind无论如何,你可以使用哪个可能是更好的选择.

  • `std :: ptr_fun`可以将二进制函数转换为`AdaptableBinaryFunction`:http://www.sgi.com/tech/stl/ptr_fun.html (8认同)