我试图在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
我在这里缺少什么?
答案 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
的副本。