[英]Any way to let the use of function pointers as template arguments easier?
我可以使用函数指针作为模板参数,如下所示
template<class R, class T, R (*Fun)(T)>
class MyClass;
任何使其变得容易的方法
MyClass<&MyFun> a;
这是一个可怕的答案,但我想不到一个更好的答案。
template<typename R, typename Arg, R(*Fun)(Arg)>
class MyClass {};
template<typename R, typename Arg>
struct MyClassHelper {
template<R(*Fun)(Arg)>
struct Class {
typedef MyClass<R, Arg, Fun> type;
};
};
template<typename R, typename Arg>
MyClassHelper<R, Arg> GetMyClass(R(*Fun)(Arg)); // no impl
void MyFun(int) {}
int main() {
typedef decltype( GetMyClass(&MyFun) ) A;
typedef A::Class<&MyFun> B;
typedef B::type a;
// or, in one line:
decltype( GetMyClass(&MyFun) )::Class<&MyFun>::type b;
}
这是罪恶的丑陋。 但是至少它提取了MyFun
的参数类型而不重复它们...
这不可能完全像问题中的那样,但是是的,如果您稍微调整一下设计是可能的。 让我们举个例子:
假设您具有以下功能:
int foo (int i) { return i; }
现在您要写:
MyClass<&foo> a; // instead of `Myclass<int, int, &foo> a;
在这里您将如何实现它。 首先更改简单功能:
int foo (int i) { return i; }
封装函数对象:
struct foo { // <--- function name here
int operator () (int i) { return i; } // <--- function body here
};
两者几乎相同(在函数对象的情况下,额外传递了this
指针,这在自由函数的情况下不会发生):
int x = foo(2); // 1st case
int x = foo_(2); // 2nd case where `foo_` is an object of `struct foo`
现在,您可以随意使用!
template<class Func>
class MyClass {...}
MyClass<foo> a;
这是一个工作示例 。
已经有std::ptr_fun
。 使用C ++ 11,您可以将其用作
auto a = std::ptr_fun(&MyFun);
更新 :
正如其他尝试和非尝试BTW所显示的那样,使用您的模板是不可能的,至少所有模板“都一样容易” ;-)。 但是,您可以做的是,如果您的主要目标是“尽可能简单”,则可以重新实现现有的标准模板功能模式( std::ptr_fun
, std::make_pair
等)以返回所需的类型。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.