2009-12-14 1 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'이 당신의 작업에 더 적합하다는 것을 알고 있다고 가정합니다. –

+0

예, 이것은 구문을 배우기위한 것입니다. – Naveen

답변

1

나는 당신이하려는 일이 가능하다고 생각하지 않습니다. for_each은 범위의 각 요소에 함수를 적용하지만 두 개의 멤버 함수를 호출하려고하므로 두 함수를 모두 바인드해야합니다. 나는 귀하의 코드가 for_each을 사용할 때 할 수있는 최선이라고 생각합니다. 람다 (Lambda) 문서는 나에게 매우 완전 해 보이지만, 당신이하려고하는 것에 대한 예는 없다. 나는 그것이 이유라고 생각한다. 이것을위한 더 적절한 알고리즘이있다. Kirill이 말한대로 transform입니다.

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