以成员函数为参数的成员函数

Member function that takes member function as parameter

提问人:Nathan Xu 提问时间:10/20/2023 更新时间:10/20/2023 访问量:116

问:

我有一个类 Hunter,它有一个成员函数,它返回一个应该等同于某个点 (x, y) 的函数。我正在尝试实现第二个成员函数,该函数将返回给定目标对、成员函数本身和类本身到达目标点所需的尝试次数。random_huntpair<int, int> consttest_huntrandom_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

C++ 返回类型 成员函数 的指针

评论

2赞 Some programmer dude 10/20/2023
OT:按常量值 (like ) 返回是没有用的。没有什么能阻止调用方保存可修改的副本。std::pair<int, int> const
1赞 Some programmer dude 10/20/2023
至于你的问题,模板和lamdas是我的建议。 并呼叫喜欢template<typename F> int test_hunt(F func, ...) { func(...); }object1.test_hunt([&object2](...) { object2.random_hunt(...); }, ...)
0赞 Some programmer dude 10/20/2023
或者更好的是,想出一个不需要你传递函数作为参数的设计。
1赞 Pepijn Kramer 10/20/2023
std::p air(和元组)旨在用于对无意义数字的模板编程。在所有其他情况下,您应该声明一个结构(具有两个值)并返回该结构。@Someprogrammerdude我不同意,它声明了一个意图(例如返回一个加密的字符串)。复制的额外行可能会在代码审查期间触发问题(就像const_cast一样)。代码也与语义有关
1赞 Some programmer dude 10/20/2023
我的评论是关于按值返回一个常量对象。返回对常量对象的引用是另一回事。

答:

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 的示例