我可以使用函数指针作为模板参数,如下所示
template<class R, class T, R (*Fun)(T)>
class MyClass;
任何让它变得容易的方法
MyClass<&MyFun> a;
我可以使用函数指针作为模板参数,如下所示
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