2

我正在尝试在 std::transform 中使用 boost::bind 连接两个字符串

假设我的类有两种方法来获取两个字符串(第一个和第二个)并且容器是字符串向量,我试图做如下

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

我在这里想念什么?

4

3 回答 3

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));
于 2013-08-08T13:53:12.657 回答
0

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

std::for_each(oldVec.begin(), oldVec.end(), [&newVec](Myclass& mc) -> void { newVec.push_back(mc.getFirstString() + mc.getSecondString()); });
于 2013-08-08T13:40:35.143 回答
0

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

#include <boost/foreach.hpp>

BOOST_FOREACH(Myclass const& it, oldVec) {
  newVec.push_back(it.getFirstString() + it.getSecondString());
}

顺便说一句,你的问题写得不好,所以我可以自由地假设你实际上是在向量中存储副本。Myclass

于 2013-08-08T13:53:35.627 回答