#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;
}
}
對於上述所有方法,我收到錯誤「可以調用成員函數沒有對象」在包含綁定調用的行上。我曾嘗試使用boost :: lambda :: bind和boost :: bind。雖然這種使用綁定的方式在定義對象時起作用,例如在main函數中。我認爲我在這裏犯了一些愚蠢的錯誤,但我無法弄清楚爲什麼這些方法都有效,或者可能是這種情況不是正確的做法。 有人可以請幫我解決這個問題,如何正確使用增強綁定爲非靜態成員的類存儲在STL容器?不能調用成員函數沒有對象的矢量shared_ptr的對象
感謝,
爲什麼不:'爲(自動常量和狀態:的getStatus()){s.insert(status.getStatus())」}'此外,如何關於不命名每個函數'getStatus'? –
@KerrekSB:有一個名爲'getStatus'的函數。一。 –
@LightnessRacesinOrbit我看到至少有兩個競爭性'getStatus'函數的證據。返回'std :: vector>的...「東西」也被稱爲是「definitelty」,它是一個不同的函數。在所有's_statuses'中,這確實看起來比嚴格必要的更復雜 –
sehe