2017-05-19 1 views
0

클래스의 정적 멤버로 저장된 벡터의 모든 요소에서 멤버 함수를 호출해야합니다.일반 함수를 정적 함수에 전달하는 방법

ptfs로이 작업을 수행하려면 코드를 많이 작성해야하지만이 작업에 도움이되는 것보다 <functional> 메커니즘이 있어야합니다.

언어 ++ 03 (VS2010)

예는 C :

난 당신이 몇 주 전에하고 싶었던 것과 비슷한 일을했던
class C 
{ 
    static std::vector<C*> pool; 

    void a(){} 
    void b(){} 
    void c(){} 

    static void Call(anymethod am) 
    { 
     for(int i=0;i<(int)pool.size();i++) 
     { 
      pool[i]->am(); 
     } 
    } 
}` 
std::vector<C*> C::pool; 
+0

질문에 누락 된 것이 있습니다. 그것은 실제적이고 구체적인 질문 일 것입니다. –

+1

주제 끄기 : 크기를 'int'로 변환하고 루프에서 오버플로가 발생할 위험이 있으므로 색인에 더 적합한 유형을 사용하십시오. 'size_t'는 당신을 위해 그것을해야합니다. – user4581301

+0

항상 클래스 C의 멤버 함수를 호출하려는 경우 멤버 함수에 대한 포인터가 작동합니다. – Phil1970

답변

1

에 대한 MSVC2010를 사용을 언어의 일부인 member-function에 대한 포인터 (<functional>이 필요 없음) :

void Call(void (C::*am)()) { 
    for (std::vector<C*>::size_type i = 0; i < pool.size(); i++) { 
     (pool[i]->*am)(); 
    } 
} 

Call(&C::a); 

그러나 할 일은 (예전 -C++ 11) 펑터를 받아들이는 것입니다 - 즉, operator()을 가진 객체. 일부는 <functional>에 내장되어 있습니다.

template<class F> 
void Call(F am) { 
    for (std::vector<C*>::size_type i = 0; i < pool.size(); i++) { 
     am(pool[i]); 
    } 
} 

Call(std::mem_fun(&C::a)); 

펑터와 반복자 범위에서 정확하게이 통과를 수행 <algorithm>의 유틸리티 메소드가있다.

template<class F> 
void Call(F am) { 
    std::for_each(pool.begin(), pool.end(), am); 
} 
+0

제 오류는 최종 표현을 괄호로 묶지 않아서 고맙습니다. – freesoft

0

. http://en.cppreference.com/w/cpp/utility/functional/placeholders

는 기본적으로 멤버 함수 조용히 당신이 일반적으로 바인딩 std::bind를 사용하는 함수에 '이'포인터를 전달 : 멤버 함수를 바인딩 할 때 내가 사용하여하고자하는 것은 &instance 매개 변수에 대한 std::placeholders::_1했다. 대신 _1 자리 표시자를 사용하여 시도한 후 f(&instance)을 호출하고 작동했습니다.

그러나, 나는 압정을 전환하고 다른 접근 방식에 나섭니다 :

#include <functional> 
class C 
{ 
    static std::vector<C*> pool; 

    void a(){} 
    void b(){} 
    void c(){} 

    static void Call(const std::function<void(C*)>& func) 
    { 
     for(int i=0;i<(int)pool.size();i++) 
     { 
      func(pool[i]); 
     } 
    } 
} 

을 그리고 특정 멤버 함수라는 함수에 전달 : 사용

Call([=](C* obj){ 
    obj->am(); // change this to whatever member function you want to call 
}); 

나는이

관련 문제