2017-11-13 22 views
2

템플릿 기반 기능 :템플릿 함수가 람다의 주장을 추론 할 수 있습니까? 다음과 같이 그 함수 포인터의 인수를 추론 할 수있는 함수 포인터를 취

template<class... Args> 
void func(void (*ptr)(Args&& ...)) { 
    //Do something useful knowing the Args... 
} 

당신이 인수로 람다와 동일 할 수있다; std::function에 의존하거나 function_traits와 같은 메타 프로그래밍 특성 클래스를 쓰지 않고? 함수를 사용하여 인수를 추론합니다.

답변

4

아니요, 불가능합니다. 템플릿 인수 공제 만 예에서와 같이 void(*)(Args&&...)에서 voidArgs...을 추론하거나 T(&)[N]에서 TN을 추론, 예를 들어, 인수 형식의 "구조적으로"일부 유형, 상수 및 템플릿을 추론 할 수있다. 유형에 나타나지 않는 것을 추론 할 수는 없습니다.

비 다형성 람다 유형 T의 경우 &T::operator() 유형에는 람다의 인수 유형에 대한 정보가 있습니다. 그러나 T 자체는 그렇지 않습니다.

+0

람다 매개 변수를 얻기위한 인수로'decltype (& T :: operator()) (Args && ...)'와 같은 것을 쓸 수 있다는 것을 의미합니까, 아니면 엄격히 불가능합니까? – Brian

+0

@Brian 네, 람다가 다형성이 아니라면'R (T :: *) (Args ...)'를 인자 타입으로두고'& T :: operator()'를 인자로 넘길 수 있습니다. 람다의'operator()'는 const-qualified 일 수도 있고 아닐 수도 있고'noexcept' 일 수도 있고 가지지 않을 수도 있으며, 후행을 가질 수도 있고 가지지 않을 수도 있기 때문에 모든 경우를 커버하기 위해 총 8 오버로드가 필요합니다 생략. – Brian