2009-12-14 143 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));