Можно ли передать функцию-член (метод), зависящую от экземпляра, в алгоритм STL от другой функции-члена напрямую? - PullRequest
0 голосов
/ 21 апреля 2020

Я хочу сделать что-то вроде этого:

#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> v{1,2,3,4,5};
    Multiplier multiplier{3};

    auto res = multiplier.transform(v);
}

Я видел решения с std :: mem_fun () и std :: bind2nd (), и я знаю обходной путь через лямбду.

Но существует ли более удобный способ сделать это, возможно, в последних стандартах c ++?

(потому что ответы, которые я видел о mem_fun, были немного в возрасте.)

Спасибо.

1 Ответ

1 голос
/ 21 апреля 2020

Не напрямую, потому что у функции-члена есть «скрытый» параметр, который является объектом, к которому «вызывается» метод.

Поэтому, когда вы пишете:

Multipler m;
m.apply(1.0);

что действительно происходит, так это то, что Multiplier::apply вызывается с двумя параметрами: объект m (к которому вы можете обратиться, используя ключевое слово this), и двойной x.

transform хочет что-то, что можно вызвать с одним параметром, а Multiplier::apply - это не так.

mem_fun и т. Д. c позволяют вам создать функциональный объект, который можно вызывать с одним параметром, указав объект ранее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...