如何给一个成员函数作为参数?

How to give a member function as a parameter?

我正在为 C++ 模板、函数和绑定而苦苦挣扎。

假设我的 class A 是这样的 :

class A {
    void set_enabled_for_item(int item_index, bool enabled); 

    void set_name_for_item(int item_index, std::string name); 

    int item_count();
}

我想在 A 中创建一个这样的方法:

    template <typename T>
    void set_for_all_items(T value, ??? func) {
        auto count = trackCount();
        for (auto i = 0; i < count; ++i) {
            func(i, value);
        }
    }

所以我可以用参数 A 的成员函数调用它,像这样(或像这样):

auto a = new A;
a->set_for_all_items("Foo Bar", &A::set_name_for_item);

三个???就是第二个参数的类型。由于我对 std::function、std::bind 和模板还很陌生,所以我尝试了我已经知道的使用方法,但我总是遇到编译错误。

那么怎么做呢?

标准成员函数的语法是Ret (Class::*) (Args...)。在您的情况下,这可能看起来像这样(未经测试):

template <typename T, typename Arg>
void set_for_all_items(T value, void (A::* func) (int, Arg)) {
    auto count = trackCount();
    for (auto i = 0; i < count; ++i) {
        (this->*func)(i, value); //note the bizarre calling syntax
    }
}

这将允许您使用所需的语法进行调用:

auto a = new A;
a->set_for_all_items("Foo Bar", &A::set_name_for_item);

如果你想使用 std::function,你需要使用 lambda 或 std::bind 或类似的东西使用隐式对象参数来包装你的成员函数。