考虑一个模板类,例如:
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::type // 错误 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 是模板化或多态的,则不需要您知道函数的确切类型。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)