C ++ "비 유형 포인터 기능 기능"클래스 템플릿 매개 변수의 공제
문제
다음과 같은 템플릿 클래스를 고려하십시오.
template<typename ReturnType, ReturnType Fn()>
class Proxy
{
void run()
{
ReturnType ret = Fn();
// ... do something ...
}
};
// and a functions
int fn1() { return 5; }
float fn2() { return 5; }
이것은 다음을 사용하여 인스턴스화 할 수 있습니다.
Proxy<int, &fn1> p1;
그러나 반환 값 유형을 명시 적으로 선언하는 것은 불필요한 것 같습니다. 내가 달성하려는 것은 다음과 같습니다.
someProxyInstantation<&fn1> p1;
someProxyInstantation<&fn2> p2;
불행히도, 나는 C ++ 기대가 아니며 이것은 언어의 숨겨진 구석처럼 보입니다 (적어도 나에게는).
포인터에서 함수에서 그 유형으로 이동할 수 있다면 : std :: tr1 :: result_of <& fn> :: type // 오류 1 오류 C2923 : 'std :: tr1 :: result_of': 'fn1 '매개 변수'_fty '에 대한 유효한 템플릿 유형 인수가 아닙니다.
매개 변수가 전혀 "유형"이 아니기 때문에 오류는 의미가 있습니다.
C ++ 0X에는 decltype (& fn1)가 있지만 몇 년이 지났습니다.
C ++ 03 (+TR1) 에서이 작업을 수행하는 방법이 있습니까?
제한 사항 : - functor를 전달하고 싶지 않습니다. F1 및 F2는 리턴 값이있는 글로벌 기능을 유지해야합니다 (매개 변수로 이동할 수 없음).)
해결책
C ++ 03에서는 불가능합니다. 기능 포인터를 유형이 아닌 매개 변수로 전달하려면 컴파일러가 매개 변수의 유형을 알아야합니다. 따라서 누락 된 조각을 제공해야합니다 (이 경우 리턴 유형). 프록시에 런타임에 값으로 함수 포인터를 제공하고 유일한 인수로서 IT 유형을 제공 할 수 있습니다. 그런 다음이 작업을 수행하는 발전기 기능을 작성할 수 있습니다.
template<typename T>
Proxy<T> make_proxy(T t) { return Proxy<T>(t); }
안타깝게도 현재 C ++에서는 자동 변수에 할당하려면 여전히 유형을 제공해야합니다.
Proxy<int(*)()> p = make_proxy(&fn1);
당신은 사용할 수 없습니다 auto p = make_proxy(&fn1);
아직. 왼쪽의 함수 유형을 사용하려면 기능 포인터 유형을 제공하려면 생성기 기능을 변경해야합니다.
template<typename T>
Proxy<typename boost::remove_pointer<T>::type> make_proxy(T t) {
return Proxy<typename boost::remove_pointer<T>::type>(t);
}
이제 할 수 있습니다
Proxy<int()> p = make_proxy(&fn1);
프록시를 사용하면 이제 그냥 할 수 있습니다
doSomething(make_proxy(&fn1));
그리고 dosomething이 템플릿이 있거나 다형성 인 경우, 정확한 유형의 함수를 알 필요는 없습니다.