2014-03-31 87 views
0
#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的對象

感謝,

+1

爲什麼不:'爲(自動常量和狀態:的getStatus()){s.insert(status.getStatus())」}'此外,如何關於不命名每個函數'getStatus'? –

+0

@KerrekSB:有一個名爲'getStatus'的函數。一。 –

+0

@LightnessRacesinOrbit我看到至少有兩個競爭性'getStatus'函數的證據。返回'std :: vector >的...「東西」也被稱爲是「definitelty」,它是一個不同的函數。在所有's_statuses'中,這確實看起來比嚴格必要的更復雜 – sehe

回答

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)); 
+0

對於upvote,解釋說傳遞'* _1'作爲第一個參數並不好,因爲'* _1'是'status',不能作爲'這個'指針。這就是爲什麼編譯器認爲OP正在嘗試像靜態成員函數一樣調用非靜態成員函數的原因。 (出於興趣,我想知道'&* _ 1'是否對佔位符有效?) –

相關問題