2012-06-12 3 views
0

클래스 A에는 멤버 변수 vector<B>이 있습니다. 모든 벡터를 반복하고 함수를 적용 할 DoToAll(funcPtr)이라는 함수 템플릿을 정의하려고합니다.다른 클래스 멤버 함수에 대한 포인터를받는 멤버 함수 템플릿 추가 function 추가 function

class A 
{ 
vector<B> v; 
template <?????> 
void DoToAll(f); 
loop on v and apply the member function f; 
} 

class B{ 
void f1(); 
void f2(); 
. 
. 
. 
} 

DoToAll은 어떻게 작성합니까?

+4

같은 것을 쓸 수있다? 덕분에 –

답변

4

인수가 함수 포인터 여야한다고 주장합니까? 그렇지 않으면, 그냥

template <class F> 
void DoToAll(F f) { 
    std::for_each(v.begin(), v.end(), f); 
} 

모든 f 일을 위해 작동 될 수 있습니다. f(x), 여기서 x은 벡터의 요소입니다. 즉, 함수 포인터와 펑터 (예 : std::functionstd::bind)가 괜찮음을 의미합니다. 불행하게도 멤버 함수 포인터는 포함하지 않습니다. x->*f() 이니까 f()이 아닙니다. 그러나 올바르게 전달할 functor에 멤버 함수 포인터를 래핑하여이를 극복하는 것도 가능합니다. 표준은 이미 그러한 어댑터를 제공합니다. 적절한 어댑터는 mem_fun_ref_t입니다. 당신이 여기에만 기능을 사용하는 경우

template <class This, class Ret> 
void DoToAll(Ret (*This::f)()) { 
    std::for_each(v.begin(), v.end(), std::mem_fun_ref(f)); 
} 
+0

! 나는 C++에 익숙하다. for_each는 멤버 함수에서 작동 할 수 있는가? – Tomer

+0

@Tomer : 편집을 참조하십시오. – jpalecek

0

, 당신은 전혀 템플릿을 필요가 없습니다 당신은 함수 포인터를 취 DoToAll의 과부하를 추가 할 수 있습니다.

void DoToAll(void (*f)(B&)) { /*...*/ } 

그래서 당신은 당신이`표준 : for_each`를 다시 작성하려면 그래서이

void Change(const B& what) 
{ 
    what.ChangeSomething(); 
} 
//... 
a.DoToAll(Change) // or a.DoToAll(&Change) 
관련 문제