2013-11-22 1 views
3

누군가가 설명 할 수 있다면, 주어진 유형이 TX이고, std::function이 템플릿 매개 변수로 사용됩니다.std :: function, template parameter T (X)

int(double)double에서 int까지의 일반적인 캐스트처럼 보이므로 std::function은 어떻게 다른 유형으로 파싱됩니까? 검색을 수행했지만이 질문에 특별히 언급 된 내용을 찾지 못했습니다. 감사!

+2

'int (double)'은 함수 유형입니다. 'int f (double)'선언이됩니다. – zch

답변

2

부분 템플릿 전문화를 사용할 수 있습니다. 이것 좀 봐 :

template <typename T> 
class Func; 

template <typename R, typename... Args> 
class Func<R(Args...)> 
{ 
public: 
    Func(R(*fptr)(Args...)) {/*do something with fptr*/} 
}; 

이 클래스는 단일 템플릿 매개 변수를 사용합니다. 그러나 R(Args...) (즉, R을 반환하고 0 개 이상의 인수를 취하는 함수 유형)과 일치하지 않으면 클래스 정의가 없습니다.

int main() { Func<int> f; } 
// error: aggregate 'Func<int> f' has incomplete type and cannot be defined 

.

int func(double a) { return a+2; } 
int main() { Func<int(double)> f = func; } 
// ok 

전문화는 이제 마법을 할 RArgs에서 작동 할 수 있습니다.

int(double)은 함수 유형입니다. 원시 함수 객체를 만들 수 없으므로 일반적으로 템플릿 세계 외부에서이 구문을 볼 수 없습니다. Tint(double)이면 T*int(*)(double)과 같은 함수 포인터입니다.

+0

도움이되는 답변에 감사드립니다. – AlmostSurely

관련 문제