2012-02-16 2 views
3

가정하자 나는 임의의 컨테이너 유형 (C++ 11)에 무언가를하는 기능이 :이 같은 다른 함수에서이 함수를 호출 할 수 있습니다다른 함수에 함수 템플릿을 통과

template<class containerType> 
void bar(containerType& vec) { 

     for (auto i: vec) { 
       std::cout << i << ", "; 
     } 

     std::cout << '\n'; 
} 

:

void foo() { 
     std::vector<int> vec = { 1, 2, 3 }; 
     bar(vec); 
} 

지금 난 그냥 바 같은 다른 기능을 가지고 가정, 나는 다음 foo는 이런 식으로 뭔가 보일 것 foo는 이러한 기능 중 하나를 전달하려는 :

template<class funcType> 
void foo(funcType func) { 
    std::vector<int> vec = { 1, 2, 3 }; 
    func(vec); 
} 

그러나,이 같은 전화 푸 (바 기능하지만 함수 템플릿이 아니므로, 꽤 지우기)

foo(bar); 

이 작동하지 않습니다. 이것에 대한 좋은 해결책이 있습니까? 이 작업을 수행하기 위해 foo를 어떻게 정의해야합니까?

편집 : 코멘트에 요구 여기에 당신이 푸 INT의 벡터와 함께 작동 알고 있다면, 당신은 bar< std::vector<int> > 기능을 전달할 수

#include <iostream> 
#include <vector> 
#include <list> 

template<class containerType> 
void bar(containerType& vec) { 

     for (auto i: vec) { 
       std::cout << i << ", "; 
     } 

     std::cout << '\n'; 
} 

template<typename funcType> 
void foo(funcType func) { 

     std::vector<int> vals = { 1, 2, 3 }; 
     func(vals); 

} 

int main() { 
     // foo(bar); - does not work. 
} 
+0

최소 컴파일 가능한 예가 누락되었습니다 –

+1

왜 함수 포인터를 사용합니까? 나는 functor를 사용하는 것이 더 좋을 것이라고 믿는다. – AlexTheo

+0

@AlexTheo 귀하의 의견을 보내 주셔서 감사합니다. 물론 펑터를 사용하는 것은 간단합니다! Bob은 대답과 비슷한 해결책을 게시했습니다. 나는 그걸로 갈거야! – fdlm

답변

2

이와 비슷한? 이것은 당신이 foo(bar)을 수행 할 수 있습니다 http://ideone.com/HEIAl

에서

#include <iostream> 
#include <vector> 
#include <list> 

struct Test{ 
template<class containerType> 
static void apply(containerType& vec) { 

     for (auto it = vec.begin(); it != vec.end(); ++it) { 
       std::cout << *it << ", "; 
     } 

     std::cout << '\n'; 
} 
}; 

template<class FuncStruct> 
void foo() { 

     std::vector<int> vals; 
     vals.push_back(1); 
     FuncStruct::apply(vals); 

} 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    foo<Test>(); 
    return 0; 
} 
+0

감사! @AlexTheo가 주석에서 지적한 것처럼, 펑터를 사용하는 것이 아마도 가장 쉬운 해결책 일 것입니다. – fdlm

3

..., 최소한의 compileable 예이다.

합리적인 해결책은 foo을 정의하는 모듈이 사용 된 컨테이너의 typedef를 정의하는 것입니다. 그럼 bar도 템플릿이 필요하지 않습니다.

+0

답변 해 주셔서 감사합니다. 나는 foo의 호출자가 foo가 내부적으로 어떻게 작동하는지 알지 못한다. 그는 임의의 컨테이너에서 작동하는 함수를 전달해야한다는 것을 알고있다. – fdlm

+0

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

+1

@fdlm하지만 함수는 임의의 컨테이너에서 작동하지 않습니다. 그것은 템플릿 함수이기 때문에 컴파일 타임에 필요한 컨테이너 유형에 대한 함수를 만드는 것으로 생각하십시오. – juanchopanza

4

온라인 데모 (안 완전히 깨어, 요점을 놓칠 수도 있습니다). 템플릿 함수 나 템플릿 클래스를 전달하는 대신 template-member-function이있는 템플릿이 아닌 클래스를 전달합니다.

#include <iostream> 
#include <vector> 
#include <list> 

struct { 
    template<class containerType> 
    void operator() (containerType& vec) { 

     for (auto i = vec.begin(); i!=vec.end(); ++i) { 
       std::cout << *i << ", "; 
     } 

     std::cout << '\n'; 

    } 
} bar; 

template<typename funcType> 
void foo(funcType func) { 

     std::vector<int> vals = { 1, 2, 3 }; 
     func(vals); 

} 

int main() { 
     foo(bar); 
} 
관련 문제