考虑模板类,如:

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> ::类型//错误1错误C2923: '的std :: TR1 ::的result_of': 'FN1' 不是参数的有效模板类型参数 '_Fty'

错误有道理的,因为该参数不是“类型”在所有

的C ++ 0x具有decltype(FN1),但是几年的时间。

<强>在做这个C ++ 03的任何方式(+ TR1)吗

限制:   - 我不想传递函子,f1和f2具有保持具有一个返回值(不能将其移动到参数)的全局函数)

有帮助吗?

解决方案

这是不可能的在C ++ 03。如果你想通过一个函数指针作为非类型参数,编译器必须知道参数的类型。所以,你必须提供缺件(在这种情况下,返回类型)。你可以给代理的函数指针在运行时的值,并为它提供作为唯一的参数它的类型。然后,你可以写一个函数发生器为你做这件工作:

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