2009-04-05 6 views
7

이 질문은 항상 for 루프 또는 이와 유사한 것을 작성할 수 있으므로 스타일 문제입니다. 그러나 쓰기에 상응하는 덜 눈에 띄는 STL 또는 BOOST가 있습니까?컨테이너의 각 요소에 대한 멤버 함수 호출

for (container<type>::iterator iter = cointainer.begin(); 
    iter != cointainer.end(); 
    iter++) 
iter->func(); 

? (상상) 같은

뭔가이 :

call_for_each(container.begin(), container.end(), &Type::func); 

나는 1) 적은 입력, 2) 쉽게 읽을 수있는,있을 거라고 생각 3) 작은 변화는 기본 유형/컨테이너 유형을 변경하기로 결정합니다.

EDIT : 회원님의 도움에 감사드립니다. 이제 회원 함수에 몇 가지 인수를 전달하고 싶습니다.

답변

4

A가 작업에 적합 것 같다 쓴 플러스 당신이 방법에 추가 인수를 전달할 수 있습니다

#include <iostream> 
#include <functional> 
#include <boost/bind.hpp> 
#include <vector> 
#include <algorithm> 

struct Foo { 
    Foo(int value) : value_(value) { 
    } 

    void func(int value) { 
     std::cout << "member = " << value_ << " argument = " << value << std::endl; 
    } 

private: 
    int value_; 
}; 

int main() { 
    std::vector<Foo> foo_vector; 

    for (int i = 0; i < 5; i++) 
     foo_vector.push_back(Foo(i)); 

    std::for_each(foo_vector.begin(), foo_vector.end(), 
     boost::bind(&Foo::func, _1, 1)); 
} 
+0

+1 왜냐하면 그 바인드 응답으로 5 분이 날 때리기 때문입니다. 바운드 인수를 사용할 때 p (오, std :: mem_fun_ref는 쓰레기입니다!) –

+0

+1, 혼자서도 부스트를 사용하지 않고 이것을 알아내는 것입니다. 건배! – dirkgently

+0

회원 함수에 참조 매개 변수가있을 때 참조에 참조가있는 경우를 의미합니다. boost :: bind는 그것을 아주 멋지게 해결합니다 :) –

22
#include <algorithm> // for_each 
#include <functional> // bind 

// ... 

std::for_each(container.begin(), container.end(), 
        std::bind(&Type::func)); 

std::for_each 및 자세한 내용은 std::bind 문서를 참조하십시오.

은 편집 부재 :

std::for_each(foo_vector.begin(), foo_vector.end(), 
    std::bind(&Foo::func, std::placeholders::_1)); 
+0

8 초 나를 이길 – JaredPar

+0

@ JaredPar/BB : ROFLMAO! – dirkgently

+0

속도에 맞는 2 센트입니다 :) –

5

당신은 std::for_each 또는 boost's foreach constructs를 사용할 수 있습니다 이제까지해야하는 경우 어쨌든 여기에, 부스트를 사용하지 않고 당신이 원하는 것을 달성하는 또 다른 방법입니다.

논리를 다른 기능으로 이동하지 않으려면 부스트의 BOOST_FOREACH 또는 BOOST_REVERSE_FOREACH를 사용하십시오.

+1

+1. BOOST_FOREACH (type & t, container) t.func(); 꽤 깔끔하게 보입니다. –

0

실제로 코드를 멋지게 처리하는 대신 성능을 향상시키고 싶다면 맵 기능 만 있으면됩니다. 에릭 싱크 내가 그 부스트 바인드를 발견 .net implementation

+0

고마워요, 저는 제네릭 C++ (플랫폼 독립적 인) 솔루션을 찾고 있습니다. – kyku