누군가가 설명 할 수 있다면, 주어진 유형이 T
과 X
이고, std::function
이 템플릿 매개 변수로 사용됩니다.std :: function, template parameter T (X)
int(double)
은 double
에서 int
까지의 일반적인 캐스트처럼 보이므로 std::function
은 어떻게 다른 유형으로 파싱됩니까? 검색을 수행했지만이 질문에 특별히 언급 된 내용을 찾지 못했습니다. 감사!
누군가가 설명 할 수 있다면, 주어진 유형이 T
과 X
이고, std::function
이 템플릿 매개 변수로 사용됩니다.std :: function, template parameter T (X)
int(double)
은 double
에서 int
까지의 일반적인 캐스트처럼 보이므로 std::function
은 어떻게 다른 유형으로 파싱됩니까? 검색을 수행했지만이 질문에 특별히 언급 된 내용을 찾지 못했습니다. 감사!
부분 템플릿 전문화를 사용할 수 있습니다. 이것 좀 봐 :
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
전문화는 이제 마법을 할 R
및 Args
에서 작동 할 수 있습니다.
int(double)
은 함수 유형입니다. 원시 함수 객체를 만들 수 없으므로 일반적으로 템플릿 세계 외부에서이 구문을 볼 수 없습니다. T
이 int(double)
이면 T*
은 int(*)(double)
과 같은 함수 포인터입니다.
도움이되는 답변에 감사드립니다. – AlmostSurely
'int (double)'은 함수 유형입니다. 'int f (double)'선언이됩니다. – zch