문제

다음과 같은 템플릿 클래스를 고려하십시오.

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이 템플릿이 있거나 다형성 인 경우, 정확한 유형의 함수를 알 필요는 없습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top