2013-07-09 11 views
1
#include <vector> 
#include <iostream> 
#include "boost/function.hpp" 


template <class T1, class T2, class T3> 
static void 
FOREACH (T1 cont, boost::function<T2(T3)> callback) { 
    typename T1::iterator it = cont. begin(); 
    for (; it != cont. end(); it++) { 
     callback (*it); 
    } 
} 


static void 
Print (int number) 
{ 
    std:: cout << number << std:: endl; 
} 


int main() 
{ 
    std:: vector<int> vec; 
    for (int i=1; i <= 10; ++i) vec. push_back (2*i); 

    FOREACH (vec, fun); 

    return 0; 
} 

위의 코드가 컴파일되지 않는 이유는 무엇입니까? 아래와 같이 특수화 된 버전을 만들면 정상적으로 작동합니다.함수 템플릿이있는 boost :: function

static void 
FOREACH (std:: vector<int> cont, boost::function<void(int)> callback) { 
    std:: vector<int>:: iterator it = cont. begin(); 
    for (; it != cont. end(); it++) { 
     callback (*it); 
    } 
} 

기능 템플릿을 사용하여 boost :: function을 어떻게 사용할 수 있습니까?

+1

'재미'가 선언되지 않았음에도 도움이되지 않습니다. – juanchopanza

+0

'재미'는 오타가 의도적으로 '인쇄' –

답변

1

펑에게 템플릿 매개 변수 만들기 위해 간단 할 것입니다 : 당신이 실제로 존재하는 호환 호출 엔티티 통과 제공,

template <class T1, class F> 
static void FOREACH (T1 cont, F callback) { 
    typename T1::iterator it = cont.begin(); 
    for (; it != cont. end(); it++) { 
     callback (*it); 
    } 
} 

이 작동 것입니다. 물론 std::for_each을 사용하는 것이 더 쉬울 것입니다.

#include <algoritm> 

... 

std::for_each(vec.begin(), vec.end(), Print);