繁体   English   中英

有什么方法可以更轻松地将函数指针用作模板参数?

[英]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_funstd::make_pair等)以返回所需的类型。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM