2013-08-15 4 views
-1

클래스 A의 객체에 대한 공유 포인터 벡터가 있다고 가정합니다. 모든 A 객체에 대해 A :: foo 메서드의 모든 반환 값을 수집하고 일부 컨테이너, 다른 벡터 말하기. std::transform 또는 std::for_eachstd::bind 또는 일부 boost의 기능을 수행 할 수 있습니까?std :: transform을 사용하여 객체의 함수 호출

class A { 

    public: 
    string foo(int p); 

}; 

std::vector<shared_ptr<A>> vec; 

답변

4

std::transform이 괜찮지 :

std::vector<std::string> string_vec; 
const int magic_number = 42; 
std::transform(std::begin(vec), 
       std::end(vec), 
       std::back_inserter(string_vec), 
       [magic_number](std::shared_ptr<A> a){ return a->foo(magic_number); }); 

물론, 당신은 당신이 A::foo(int)에 전달하고자하는 int 파악해야합니다. C++ 03에서

, 당신은 펑 또는 기능에 의해 람다를 대체 할 수

struct get_foo 
{ 
    get_foo(int n) : n_(n) {} 
    bool operator() (std::shared_ptr<A> a) const { return a->foo(n); } 
private: 
    int n_; 
}; 

const int magic_number = 42; 
std::vector<std::string> string_vec; 
std::transform(std::begin(vec), 
       std::end(vec), 
       std::back_inserter(string_vec), 
       get_foo(magic_number)); 
+0

당신은'A-> 전화 foo', 당신이 원하는 것 여러 다른 값을 전달해야하는 경우 람다 (lambda) 함수를 사용하는 대신 펑터 (functor)를 만들어서 상태를 저장할 때 저장할 수 있습니다. 대답에 대해 –

+0

고마워요. 나는 람다없이 C++의 이전 버전을위한 방법을 찾고 있었는데, vec의 반복자를 사용하는 우리 자신의 커스텀 펑크 션을 정의하지 않고서도 바인드와 사용 가능한 stl 펑터로이를 수행 할 수있다. – user124

+1

@ZacHowland 또 다른 옵션은 다른 벡터에 값을 넣고'std :: transform'의 바이너리 펑터 오버로드를 사용하는 것입니다. 그러나 문제의 세부 사항의 희소성을 감안할 때, 나는 '42'가 사용할 좋은 번호라고 생각한다. – juanchopanza