I have one class Hunter that has a member function random_hunt which returns a pair<int, int> const that's supposed to be equivalent to some point (x, y). I'm trying to implement a second member function test_hunt which will return the number of tries it takes the random_hunt to land on a target point given the target pair, the member function itself, and the class itself.
I have attempted two implementations:
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;
}
};
in main:
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;
Neither compile and I'm not sure why. I've looked at previous examples that do something similar using member functions of void return type and they seem to work fine. Is it the return type in my case that's making the difference, or have I simply implemented the function incorrectly?
std::pair<int, int> const) is useless. Nothing stops the caller to save a copy that can be modified.template<typename F> int test_hunt(F func, ...) { func(...); }and call likeobject1.test_hunt([&object2](...) { object2.random_hunt(...); }, ...)