В комментарии
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;
}