2009-12-14 177 views
2

我正在學習boost::lambda庫,爲此我編寫了此示例代碼,通過從A對象中提取值來將vector<A>轉換爲vector<int>使用boost :: lambda調用成員函數

class A 
{ 
public: 
    A(int n) : m_n(n){} 
    int get() const {return m_n;} 

private: 
    int m_n; 

}; 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    using namespace boost::lambda; 

    std::vector<A> a1; 
    std::vector<int> a2; 
    a1.push_back(A(10)); 
    a1.push_back(A(20)); 

    std::for_each(a1.begin(), a1.end(), bind(&std::vector<int>::push_back, var(a2), bind(&A::get, _1))); 

    return 0; 
} 

我可以讓for_each部分在多次嘗試後工作。但我仍然沒有看到這樣的多重綁定。有沒有其他的方式來寫這個。最好我想做一些事情,如:a2.push_back(bind(&A::get,_1));,但不能編譯。

+0

我假設你已經知道'std :: transform'更適合你的任務。 – 2009-12-14 05:20:58

+0

是的,這只是爲了學習語法。 – Naveen 2009-12-14 05:21:46

回答

1

我不認爲你想要做什麼是可能的。 for_each將函數應用於範圍中的每個元素,但是您試圖調用兩個成員函數,並且必須將它們都綁定在一起。我認爲你的代碼是使用for_each時可以做的最好的代碼。 Lambda文檔對我來說看起來非常完整,但對於您要做的事情沒有任何示例。我認爲這是有原因的,對此有一個更合適的算法。正如Kirill說的那樣,它是transform

std::transform(a1.begin(), a1.end(), std::back_inserter(a2), bind(&A::get, _1));