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> ::类型//错误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的是模板化或以其他方式多态的,它不会要求您知道该功能的具体类型。
不隶属于 StackOverflow