2011-09-03 8 views
4

함수 포인터를 템플릿으로 쓰는 방법은 무엇입니까? 해당 함수에 대한 유형을 생성 의미하는 경우함수 포인터를 템플릿으로 사용

template <typename T> 
T (*PtrToFunction)(T a); 
+3

를 사용해야합니다. C++ 11에서는 템플리트 별칭을 가지고 있지만 그 상황을 다룰 지 확신 할 수 없습니다. –

+1

응용 프로그램의 크기가 보증하는 경우 [Boost.Function] (http://www.boost.org/doc/libs/1_47_0/doc/html/function.html)과 같은 좀 더 일반적인 펑터 객체를 사용하면 어떤 종류의 호출 가능한 객체가 아니라 함수 포인터. 작은 응용 프로그램을 작성하는 경우 귀찮게하지 마십시오. –

답변

5

, 당신이 이런 식으로 뭔가를 할 수 :

template<typename T> 
struct Function { 
    typedef T (*Ptr)(T); 
}; 

을 그리고 난 당신이 선언하려고하는 가정입니다

int blah(Function<int>::Ptr a) { } 
8

처럼 사용 유형 (구체적인 유형없이 "템플릿 변수"를 선언 할 수 없습니다).

C++ 03, 당신이 해결 방법으로 구조체를 사용할 필요가 템플릿 형식 정의를 가지고 있지 않습니다

template <typename T> 
struct FuncPtr { 
    typedef T (*Type)(T a); 
}; 

... 

// Use template directly 
FuncPtr<int>::Type intf; 

// Hide behind a typedef 
typedef FuncPtr<double>::Type DoubleFn; 
DoubleFn doublef; 

C++ (11) 템플릿 별칭이 구조체의 해결 방법을 제거되지만를 Clang 제외하고는 현재 어떤 컴파일러 없다 이것을 실제로 구현하십시오.

template <typename T> 
typedef T (*FuncPtr)(T a); 

// Use template directly 
FuncPtr<int> intf; 

// Hide behind a typedef 
typedef FuncPtr<double> DoubleFn; 
DoubleFn doublef; 
+0

GCC 4.7에서 GCC가 이제 템플릿 별칭을 지원한다는 점을 언급하기 위해이 오래된 항목을 업데이트하십시오. –

0

당신은 그렇게 할 수 없습니다. 구체적인 유형의 함수 포인터 만 작성할 수 있습니다.

0

은 비주얼 스튜디오 2015 괜찮아요와 GCC에 존재하지 않는 "템플릿 형식 정의"에이를 것이다 명령 행 옵션 -std=c++11

template<class T> using fpMember = void (T::*)(); 
관련 문제