c++ - 将成员函数指针作为参数传递给模板方法

标签 c++ c++11 templates lambda std-function

我正在尝试编写一个接受成员函数指针作为参数的模板化方法。

这是一个示例类,包括我最近尝试编写所述模板方法:

class MyClass
{
public:
   int myMethod() { return 1; }

   template<typename T> 
   T call(std::function<T(MyClass*)> m)
   {
      return m(this);
   }
};

我的目标是能够执行以下操作(或语法上非常相似的操作):

MyClass m;
auto result = m.call(&MyClass::myMethod);

到目前为止,通过我上面的尝试,我可以做到:

MyClass m;
std::function<int(MyClass*)> f = &MyClass::myMethod;
auto result = m.call(f);

令我惊讶的是,我什至无法将其包装成一行。 m.call(&MyClass::myMethod) 这不会编译。为什么?

我确信有一种方法可以获得我想要的行为,因此非常感谢任何帮助!

最佳答案

显然它不能推导出 T(来自非常推导的 ctor 参数的模板参数)。

如果您的目标只是在一次调用中完成,您可以将方法定义更改为类似

    template<class F> auto call(F &&f) {
        return std::invoke(std::forward<F>(f), this);
    }

关于c++ - 将成员函数指针作为参数传递给模板方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62761204/

相关文章:

c++ - 如何实际执行五项规则?

C++ STL 映射 : is access time O(1)?

c++ - 多参数类模板和我的 'vertices' 类

c++ - 在三个src文件中使用extern

c++ - 如何在一次操作中从/向文件读取/写入固定数量的整数(尽可能快,文件可以假定为二进制)?

c++ - boost::split 是如何工作的?

c++ - 单个负载是否与多个存储同步?

html - 启动一个 node.js 项目

python - Flask 模板的 {% block page_content %} - 文档

c++ - 无法使用 CImg 获得与 mandelbrot 集一起使用的颜色平滑度