Не может вызвать функцию-член без объекта для вектора shared_ptr объекта
#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, а также. Хотя этот способ использования связывания работает, если объекты определены, например, в основной функции. Я предполагаю, что я делаю здесь какую-то глупую ошибку, но я не могу понять, почему все эти подходы работают, или это может быть случай, когда это совсем не тот способ. Может кто-нибудь помочь мне решить эту проблему, как правильно использовать boost bind для нестатического члена класса, который хранится в контейнерах stl?
Спасибо,
1 ответ
Вам просто нужно использовать boost::mem_fn
, (Обратите внимание, вы также можете использовать std::mem_fn
если доступно.)
std::transform(s_statuses.begin(), s_statuses.end(), std::inserter(s, s.begin()), std::mem_fn(&status::getStatus));