2013-09-25 3 views
6

일반적인 함수 포인터를 템플릿 매개 변수로 사용할 수 있습니까? 함수 포인터 템플릿은 자유 함수, 멤버 함수 및 람다 함수를 받아 들일 수 있습니다. 정상 템플릿 인수는 함수를 참조 할 수 있습니다일반 함수 포인터를 템플릿 매개 변수로 사용하는 방법은 무엇입니까?

template<class ArgumentT, class ReturnT, typename F*> 
struct A { 
    //use F* to refer to f somewhere 
}; 
+0

다른 기능 유형 인스턴스화에 대해 서로 다른 호환되지 않는 유형이 표시됩니다. 즉, ArgumentT와 ReturnT가 같은 경우에도 A에 일반 함수 포인터를 A에 할당 할 수 없습니다. – ComicSansMS

답변

8

: 편의를 위해 기능을 가정하는 당신은 유형과 데이터를 결합하고

template<class ArgumentT, class ReturnT, function* f> 
struct A 
{ 
    // f is used somewhere. 
}; 
0

같은 하나의 인수를 가지고, 당신은 더 많은 뭔가를 원한다. 당신은 쉽게 operator() 과부하 몇 가지 클래스를 사용하고 (사실, 그것은 종종 바람직이고,) 대신에를 호출 할 수 -하지만 함수에 템플릿 인수를 제한 거기에 아무것도

#include <iostream> 

template <class ArgT, class RetT, class F> 
struct A { 
    F f; 
public: 
    A(F f) : f(f) {} 

    RetT operator()(ArgT arg) { return f(arg); } 
}; 

int unchanged(int i) { return i; } 

int main(){ 
    A < int, int, int(*)(int)> t{ unchanged }; 

    for (int i = 0; i < 10; i++) 
     std::cout << t(i) << "\n"; 
} 

.

+2

이 문법이 맞습니까? – user1899020

0

당신과의 긴밀한 뭔가 얻을 수 있습니다

template<class ArgumentT, class ReturnT, class F, F f> 
struct A; 

template<class ArgumentT, class ReturnT, ReturnT (*f)()> 
struct A<ArgumentT, ReturnT, ReturnT (*)(), f> 
{ 
    // f is used somewhere. 
}; 

template<class ArgumentT, class ReturnT, class C, ReturnT (C::*f)()> 
struct A<ArgumentT, ReturnT, ReturnT (C::*)(), f> 
{ 
    // f is used somewhere. 
}; 

을 ...하지만 당신은 비 형 템플릿 매개 변수로 std::function<ReturnT()> 같은 것을받을 수 없어. 함수 포인터의 특수화는 비 캡처 람다도 허용합니다. 당신이 C++ (11)를 사용하거나 부스트 : : 기능 <>을 할 수있는 경우

2

나는 표준 : 기능 <>를 사용하는 것이 좋습니다 것입니다 경우 수 없습니다 : 당신은 함수 포인터를 전달할 수 있습니다이 경우

template<class ArgumentT, class ReturnT > struct A { 
    typedef std::function< ReturnT(ArgumentT) > Function; 
    void foobar(Function f) { ReturnT ret = f(arg); } 
}; 

, functor, lambda를 사용하거나 서명이 일치하지 않는 거의 모든 함수를 사용하여 std :: bind 또는 boost :: bind를 사용하십시오. 이 경우 템플릿이 필요하지 않은지, std :: function을 직접 사용할 수는 있지만 코드에 따라 다릅니다.

+2

그러나 std :: function을 사용할 때 많은 단점이 있기 때문에 담요 조언이 아닙니다. – xaxxon

관련 문제