如何在参数中传递函数,然后从对象调用该函数
How to pass a function in a parameter and then call that function from an object
我有一个 Sprite
class 有一个 int update(int key)
方法。
我还有另一个 class (SpriteManager
),其中包含所有 Sprites
的列表。我想向此 class 添加一个方法,该方法接受一个方法和一个 int 作为参数。然后我想遍历这个列表并对所有对象调用该方法。但是,我找不到任何方法来做到这一点。我知道如何将函数作为参数传递,以及如何在上下文之外的对象上调用 specific 方法,但我不知道如何两者都做。
使用此方法的示例如下:
sm.tellSpritesToDoSomething(Sprite::update, 42);
其中 sm
是 SpriteManager
。
你应该检查 std::bind, std::function and placeholders。永远记住,方法本身是不够的,你需要传递将在内部用作 this 的对象。例如
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));
}
我有一个 Sprite
class 有一个 int update(int key)
方法。
我还有另一个 class (SpriteManager
),其中包含所有 Sprites
的列表。我想向此 class 添加一个方法,该方法接受一个方法和一个 int 作为参数。然后我想遍历这个列表并对所有对象调用该方法。但是,我找不到任何方法来做到这一点。我知道如何将函数作为参数传递,以及如何在上下文之外的对象上调用 specific 方法,但我不知道如何两者都做。
使用此方法的示例如下:
sm.tellSpritesToDoSomething(Sprite::update, 42);
其中 sm
是 SpriteManager
。
你应该检查 std::bind, std::function and placeholders。永远记住,方法本身是不够的,你需要传递将在内部用作 this 的对象。例如
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));
}