#include <boost/ref.hpp>
//#include <boost/bind.hpp>
#include <boost/shared_ptr.hpp>
#include <boost/lambda/lambda.hpp>
#include <boost/lambda/bind.hpp>
#include <boost/mem_fn.hpp>
using namespace std;
using namespace boost::lambda;
class Base {
public:
Base () {}
bool toBeRemoved() const {
return true;
}
};
class status : public Base {
std::string name_;
bool ok_;
public:
status(const std::string& name):name_(name),ok_(true) {}
void break_it() {
ok_=false;
}
bool is_broken() const {
return ok_;
}
void report() const {
std::cout << name_ << " is " <<
(ok_ ? "working nominally":"terribly broken") << '\n';
}
std::string getStatus() const {
return ok_ ? "1" : "0";
}
};
class some_class {
public:
int test() {
std::vector<boost::shared_ptr<status> > s_statuses = getStatus(); //some func
std::set<string> s;
std::transform(s_statuses.begin(), s_statuses.end(), std::inserter(s, s.begin()), boost::lambda::bind(boost::mem_fn(&status::getStatus), boost::ref(*_1)));
// approach #2
// std::transform(s_statuses.begin(), s_statuses.end(), std::inserter(s, s.begin()), boost::lambda::bind(boost::mem_fn(&status::getStatus), boost::ref(*_1), _1));
// approach #3
// std::transform(s_statuses.begin(), s_statuses.end(), std::inserter(s, s.begin()), boost::bind(&status::getStatus), _1));
std::copy(s.begin(), s.end(), ostream_iterator<string>(std::cout, "-"));
std::cout << endl;
return 0;
}
}
对于上述所有方法,我在包含绑定(bind)调用的行上收到错误“可以调用没有对象的成员函数”。我也尝试过使用 boost::lambda::bind 和 boost::bind。尽管这种使用 bind 的方式在定义了对象时有效,例如在 main 函数中。我想我在这里犯了一些愚蠢的错误,但我无法弄清楚为什么所有这些方法都有效,或者这可能根本不是正确的做法。 有人可以帮我解决这个关于如何为存储在 STL 容器中的类的非静态成员正确使用 boost bind 的问题吗?
谢谢,
最佳答案
您应该只需要使用 boost::mem_fn
。 (请注意,如果可用,您也可以使用 std::mem_fn
。)
std::transform(s_statuses.begin(), s_statuses.end(), std::inserter(s, s.begin()), std::mem_fn(&status::getStatus));
关于c++ - 不能为对象的 shared_ptr 的 vector 调用没有对象的成员函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22773777/