如何在参数中传递函数,然后从对象调用该函数
How to pass a function in a parameter and then call that function from an object
我有一个Sprite
类,它有一个int update(int key)
方法。
我还有另一个类(SpriteManager
),它有一个所有Sprites
的列表。我想向这个类添加一个方法,该方法将一个方法和一个 int 作为参数。然后,我想遍历此列表,并在所有对象上调用该方法。但是,我找不到任何方法可以做到这一点。我知道如何将函数作为参数传递,以及如何在上下文之外调用对象上的特定方法,但我不知道如何同时执行这两项操作。
使用此方法的示例如下所示:
sm.tellSpritesToDoSomething(Sprite::update, 42);
sm
是SpriteManager
的地方.
你应该检查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));
}
相关文章:
- 对RValue对象调用的LValue ref限定成员函数
- 检查哪个对象调用了另一个对象的对象方法
- 在 C++ 的 Switch Case 中创建对象后对对象调用方法
- 从 Base 引用对象调用派生类的成员
- 为什么为未删除的对象调用析构函数?
- Qt c++不会为所有对象调用move_slot.为什么?
- 使用在堆栈上创建的对象调用虚拟函数
- 使用基类对象调用Dervied Class函数
- C++:允许临时对象调用非常量成员函数的设计理念是什么?
- 从类中的对象调用类中的函数的最佳方法
- 派生对象调用的 Base 方法的模板推导
- 如何使用单个对象调用具有相同名称的两个类函数
- 是否可以从另一个类对象调用一个类函数而不继承第一个类
- 如果类没有任何成员变量,则通过临时对象调用类的成员函数的开销是多少?
- 如何对动态数组中的某些对象调用析构函数
- 如何从列表中存储的对象调用成员函数
- 从线程内的对象调用静态方法
- 从成员对象调用方法
- 当包含它的对象调用其析构函数时,unique_ptr是否未分配
- 从对象调用成员对象,错误:引用非常量值的初始值必须是左值