boost :: bind在std :: transform中连接字符串

时间:2013-08-08 12:17:39

标签: c++ boost boost-bind

我试图在std :: transform

中使用boost :: bind连接两个字符串

假设我的类有两个方法来获取两个字符串(第一个和第二个)并且conatiner是字符串向量,我试着按照以下方式执行

struct Myclass
{
   std::string getFirstString() {return string1}
   std::string getSecondString() {return string2}

   private:
     std::string string1;
     std::string string2;
}

Myclass myObj;

std::vector<string > newVec;
std::vector<myObj> oldVec;
std::transform (oldVec.begin(), oldVec.end(), std::back_inserter(newVec), boost::bind(&std::string::append,boost::bind(&getFirstString,  _1),boost::bind(&getSecondString, _1 ) ) ); 

但是,我收到错误说

error: cannot call member function 'virtual const getSecondString() ' without object

我在这里缺少什么?

3 个答案:

答案 0 :(得分:6)

你有两个问题。

首先,您正在错误地获取成员函数的地址。您始终必须指定班级,即boost::bind(&Myclass::getFirstString, _1)

第二个是你正在尝试绑定std::string::append,它会修改它所调用的对象。你真的想要operator +。由于您无法直接绑定,请改用std::plus<std::string>。所以它应该是这样的:

std::transform(oldVec.begin(), oldVec.end(),
               std::back_inserter(newVec),
               boost::bind(std::plus<std::string>(),
                           boost::bind(&Myclass::getFirstString, _1),
                           boost::bind(&Myclass::getSecondString, _1)
                          )
              );

或者您可以使用Boost.Lambda。当你在它的时候,使用Boost.Range,它真棒。

namespace rg = boost::range;
namespace ll = boost::lambda;
rg::transform(oldVec, std::back_inserter(newVec),
              ll::bind(&Myclass::getFirstString, ll::_1) +
                  ll::bind(&Myclass::getSecondString, ll::_1));

答案 1 :(得分:0)

如果您正在寻找一种时尚方式(一行代码)来解决您的问题,您可以使用for_each和lambdas来执行此操作:

std::for_each(oldVec.begin(), oldVec.end(), [&newVec](Myclass& mc) -> void { newVec.push_back(mc.getFirstString() + mc.getSecondString()); });

答案 2 :(得分:0)

使用您对第一个答案的评论,也许您可​​以使用Boost.Foreach:

#include <boost/foreach.hpp>

BOOST_FOREACH(Myclass const& it, oldVec) {
  newVec.push_back(it.getFirstString() + it.getSecondString());
}
顺便说一下,你的问题写得很糟糕,所以我可以自由地假设你实际上是在载体中存储Myclass副本