如何使用boost :: bind的普通函数

时间:2014-04-22 08:35:28

标签: c++

我有两个向量。我想通过一些转换将第一个向量元素复制到另一个向量元素,如下所示:

void Append(std::string& a, const std::string& b)
{
    a.append(b);
}      


std::vector<std::string> v1;
std::vector<std::string> v2;
...
std::transform (v1.begin(), v1.end(), v2.begin(), 
                 boost::bind(Append, std::string("b")));

我该怎么做?

2 个答案:

答案 0 :(得分:0)

您正在搜索的内容可能是:

std::transform (v1.begin(), v1.end(), v2.begin(), 
             std::bind(Append, std::placeholders::_1, std::string("b")));

它将使用v1的每个元素调用Append,追加"b"并将其放入v2。如果您希望将Append作为对象方法,std::bind(Class::Append, obj, std::placeholders::_1, std::string("b")));将成为您的朋友,并使用以下代码:

class SomeClass{
public:
    Append(std::string, const std::string);
}

其他课程:

obj = new SomeClass();
std::transform (v1.begin(), v1.end(), v2.begin(), 
             std::bind(Class::Append, obj, std::placeholders::_1, std::string("b")));

这样就可以绑定对象obj的方法,而不是静态类函数。

如果你想使用boost而不是标准的c ++:

boost::bind(Class::Append, obj, _1, std::string("b"))

答案 1 :(得分:0)

我会做这样的事情(脱掉袖口):

for( string& s : v1 )
{
    s.append( "b" );
}
v2 = v1;

编写更容易,更容易理解,编译器更容易优化,不需要SO问题。