如何在参数中传递函数,然后从对象调用该函数

How to pass a function in a parameter and then call that function from an object

本文关键字:对象 调用 函数 然后 参数 传递函数      更新时间:2023-10-16

我有一个Sprite类,它有一个int update(int key)方法。

我还有另一个类(SpriteManager),它有一个所有Sprites的列表。我想向这个类添加一个方法,该方法将一个方法和一个 int 作为参数。然后,我想遍历此列表,并在所有对象上调用该方法。但是,我找不到任何方法可以做到这一点。我知道如何将函数作为参数传递,以及如何在上下文之外调用对象上的特定方法,但我不知道如何同时执行这两项操作。

使用此方法的示例如下所示:

sm.tellSpritesToDoSomething(Sprite::update, 42);

smSpriteManager的地方.

你应该检查std::bind,std::function和占位符。并且永远记住方法本身是不够的,你需要传递对象,该对象将在里面用作这个。例如

sm.tellSpritesToDoSomething(std::bind(&Sprite::update, _1, 42));

其他方法是使用成员函数指针(显式或通过模板):

#include <vector>
#include <algorithm>
#include <functional>
struct Sprite {
    int update(int i) { return i; }
};
struct SpriteManager {
    std::vector<Sprite> sprites;
    template <typename F>
    void tellSpritesToDoSomething(F f, int i) {
        for (auto& sprite: sprites)
        {
            (sprite.*f)(i);
        }
    }
    void tellSpritesToDoSomething2(int (Sprite::*f)(int), int i) {
        for (auto& sprite: sprites)
        {
            (sprite.*f)(i);
        }
    }
    void tellSpritesToDoSomething3(std::function<int(Sprite&)> f) {
        std::for_each(sprites.begin(), sprites.end(), f);
    }
};
int main() {
    SpriteManager sm;
    sm.sprites.emplace_back();
    sm.sprites.emplace_back();
    sm.sprites.emplace_back();
    sm.tellSpritesToDoSomething(&Sprite::update, 42);
    sm.tellSpritesToDoSomething2(&Sprite::update, 42);
    using std::placeholders::_1;
    sm.tellSpritesToDoSomething3(std::bind(&Sprite::update, _1, 42));
}