如何给一个成员函数作为参数?
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
或类似的东西使用隐式对象参数来包装你的成员函数。
我正在为 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
或类似的东西使用隐式对象参数来包装你的成员函数。