是否可以直接将依赖于实例的成员函数(方法)从另一个成员函数传递给 STL 的算法?

Posted

技术标签:

【中文标题】是否可以直接将依赖于实例的成员函数(方法)从另一个成员函数传递给 STL 的算法?【英文标题】:Is it possible to pass member function (method) dependent on instance to STL's algorithm from another member function, directly? 【发布时间】:2020-04-21 15:11:54 【问题描述】:

我想做这样的事情:

#include <algorithm>
#include <vector>

class Multiplier 
public:
    double multiply_by;

    double apply(double x)  return x * multiply_by; 

    std::vector<double> transform(const std::vector<double>& v) 
        std::vector<double> res;
        std::transform(begin(v), end(v), std::back_inserter(res), this::apply); // I have an error on this::apply
        return res;
    
;

int main() 
    std::vector<double> v1,2,3,4,5;
    Multiplier multiplier3;

    auto res = multiplier.transform(v);

我看到了 std::mem_fun() 和 std::bind2nd() 的解决方案,我知道通过 lambda 解决方法。

但是否存在更方便的方法来实现这一点,可能在最后的 c++ 标准中?

(因为我看到的关于 mem_fun 的答案有点老了。)

谢谢。

【问题讨论】:

Lambda 是“更方便的方式” operator() 中重命名apply 可能只允许通过*this 而不绑定。 【参考方案1】:

不是直接的,因为成员函数有一个“隐藏”参数,它是方法被“调用”的对象。

所以当你写的时候:

Multipler m;
m.apply(1.0);

真正发生的事情是 Multiplier::apply 使用两个参数调用:对象 m(您可以使用关键字 this 引用)和双 x

transform 想要一个可以用单个参数调用的东西,而Multiplier::apply 不是这样。

mem_fun 等允许您通过提前提供对象来创建可使用单个参数调用的函数对象。

【讨论】:

以上是关于是否可以直接将依赖于实例的成员函数(方法)从另一个成员函数传递给 STL 的算法?的主要内容,如果未能解决你的问题,请参考以下文章

static变量和方法

成员内部类

依赖于类成员属性的类实例成员

在破坏调用期间从另一个线程未定义的行为调用对象上的方法?

是否可以在 JavaScript 构造函数中解构实例/成员变量?

07.28 关键字 继承 重写 知识点梳理