Задать вопрос
Dyikot
@Dyikot

Почему нельзя использовать private метод в качестве аргумента для алгоритмов в другом private методе?

Например для std::ranges::all_of.
  • Вопрос задан
  • 119 просмотров
Подписаться 1 Простой 1 комментарий
Решения вопроса 1
@code_panik
В комментарии Wataru уже указал на вероятную проблему. Метод класса первым аргументом принимает указатель this на объект класса, который этот метод вызывает. То есть вызов objectName.foo(100) компилируется в нечто такое foo(&objectName, 100).
Только вместо std::bind проще использовать лямбду. Если в списке захвата лямбды указать this или =, то всеми видимыми методами класса в лямбде можно пользоваться как обычно, https://godbolt.org/z/e9z76vTY7.
#include <array>
#include <algorithm>
#include <functional>
#include <iostream>

class Container {
public:
    bool isZeroLambda() {
        return std::ranges::all_of(std::begin(ar), std::end(ar),
                [this](auto x) { return isZeroValue(x); });
    }

    bool isZeroBind() {
        auto pred = std::bind(&Container::isZeroValue, this, std::placeholders::_1);
        return std::ranges::all_of(std::begin(ar), std::end(ar), pred);
    }

private:
    bool isZeroValue(int x) { return x == 0; }
    std::array<int, 3> ar{};
};

int main() {
    Container c;
    std::cout << c.isZeroLambda()
        << '\n' << c.isZeroBind();
    return 0;
}
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@r1nk
Потому что не указан struct all_of_fn как friend в вашем классе?
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы