提问人:Nathan Xu 提问时间:10/20/2023 更新时间:10/20/2023 访问量:116
以成员函数为参数的成员函数
Member function that takes member function as parameter
问:
我有一个类 Hunter,它有一个成员函数,它返回一个应该等同于某个点 (x, y) 的函数。我正在尝试实现第二个成员函数,该函数将返回给定目标对、成员函数本身和类本身到达目标点所需的尝试次数。random_hunt
pair<int, int> const
test_hunt
random_hunt
我尝试了两种实现方式:
class Hunter {
// 1
int test_hunt(std::function<pair<int, int> const()> func, pair<int, int>& const target) {
int tries = 0;
while (target != func())
tries++;
return tries;
}
// 2
int test_hunt(pair<int, int> const (Hunter::* func)(), Hunter& hunter, pair<int, int>& const target) {
int tries = 0;
while (target != (hunter.*func)())
tries++;
return tries;
}
};
主要:
Hunter hunter;
auto fp = std::bind(&Hunter::random_hunt);
std::cout << hunter.test_hunt(fp, r_start_pos) << '\n';
std::cout << hunter.test_hunt(&Hunter::random_hunt, hunter, r_start_pos) << '\n;
两者都没有编译,我不知道为什么。我看过以前的示例,这些示例使用返回类型的成员函数执行类似操作,它们似乎工作正常。是我的情况中的返回类型造成了差异,还是我只是错误地实现了该函数?void
答:
1赞
Manthan Tilva
10/20/2023
#1
您还需要传递对象指针以及方法,例如std::bind
auto fp = std::bind(&Hunter::random_hunt,&hunter);
下面是编译后的代码。
评论
0赞
Nathan Xu
10/21/2023
如果我想向函数添加参数怎么办?random_hunt
0赞
Sebastian
10/21/2023
何时指定参数?在主test_hunt内还是在内?
1赞
Manthan Tilva
10/23/2023
@NathanXu,您可以在创建函数对象(带绑定)或使用该对象时传递参数。检查 std::bind en.cppreference.com/w/cpp/utility/functional/bind 的示例
评论
std::pair<int, int> const
template<typename F> int test_hunt(F func, ...) { func(...); }
object1.test_hunt([&object2](...) { object2.random_hunt(...); }, ...)