c++ - 在集合上调用成员方法

标签 c++ c++11

我想知道在 C++11 中是否可以实现类似的功能。这里的想法是让一个类保持对集合的引用,并提供一个通用方法来对其执行一些操作。使用以下代码,我无法使用绑定(bind)调用集合中每个项目的类的方法:

#include <iostream>
#include <vector>
#include <functional>
#include <algorithm>

using namespace std;

class Foo {
public:
    void print() {
        cout << "hello" << endl;
    }
};

class Helper {
private:
    vector<Foo> v;
public:
    Helper() :
            v(5) {
    }
    void perform(std::function<void(Foo&)>&& f) {
        for_each(v.begin(), v.end(), f);
    }
};

int main() {
    Helper r;
    r.perform(bind(&Foo::print)); //it doesn't work
    r.perform([](Foo& f) {f.print();}); //it works
}

我想 bind 想要一个 Foo 的真实实例。我想知道是否可以使用 bind 而不是 lambda。我问这只是因为我想了解 C++11 是如何工作的。是否需要bindmem_fn

最佳答案

不,在您的情况下不可能使用 std::bind。正如您所说,std::bind 需要一个 Foo 的实例。顾名思义,它用于将对象绑定(bind)到不会更改的函数,这样您就不必每次都传递该对象。

void foo(int, bool) {}

int A = 10;
foo(A, false);
foo(A, true);

// now instead, I can "bind" A to foo.
auto foo2 = std::bind(&foo, A, std::placeholders::_1);
foo2(false);
foo2(true);

不过不用担心,你可以直接传递&Foo::print。为什么?因为 perform 接受一个第一个参数为 Foo& 的函数,这正是 print 接受的(它没有任何明确的参数,但是有一个隐式的 Foo&

r.perform(&Foo::print);

关于c++ - 在集合上调用成员方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48128933/

相关文章:

c++ - 连接两个 vector 的最佳方法是什么?

c++ - 使用 Allegro 5.0.2 获取操纵杆输入

c++ - 按值传递不调用移动构造函数

c++ - 构造函数委托(delegate)与默认参数

c++ - 缩放正在移动对象

c++ - 在 C++ 中存储和检索数组中的指针

c++ - 我应该多久重新播种一次 C++?

c++ - 防止基准测试的空语句优化

c++ - 我可以在 C++ 中使用 getopt 来读取带参数和不带参数的字符吗?

c++ - 从不同的基数转换后查找位数的方法