我正在尝试用 C++ 为我的游戏引擎创建 C# 事件。我现在正在实现事件系统,但我不知道如何删除向量中的 std::function。我是否使用了正确的列表?
我是 C++ 的新手,但我现在是 10 年的 C# 程序员。这在 C++ 中可能吗?
#include <algorithm>
#include <functional>
#include <iostream>
#include <vector>
struct Delegate {
std::vector<std::function<void()>> funcs;
template<class T> void operator+=(T mFunc)
{
funcs.push_back(mFunc);
}
template<class T> void operator-=(T mFunc)
{
// How?
//funcs.erase(std::remove(funcs.begin(), funcs.end(), mFunc), funcs.end());
}
void operator()() {
for (auto& f : funcs) f();
}
};
void fun1()
{
std::cout << "hello, ";
}
void fun2()
{
std::cout << "Delete";
}
void fun3()
{
std::cout << "world!" << std::endl;
}
int main() {
Delegate delegate;
delegate += fun1;
delegate += fun2;
delegate -= fun2;
delegate += fun3;
delegate();
}
Run Code Online (Sandbox Code Playgroud)
如果您愿意限制Delegate只使用函数指针,您可以使用您拥有的东西来做到这一点。那看起来像
struct Delegate {
std::vector<void(*)()> funcs;
template<class T> void operator+=(T mFunc)
{
funcs.push_back(mFunc);
}
template<class T> void operator-=(T mFunc)
{
funcs.erase(std::remove(funcs.begin(), funcs.end(), mFunc), funcs.end());
}
void operator()() {
for (auto& f : funcs) f();
}
};
Run Code Online (Sandbox Code Playgroud)
如果你不想这样做,那么你需要改变你的方法。您可以将有关如何将迭代器返回到函数的建议,请参阅eerorika 的答案。operator +=索引返回到插入的函数,然后您可以更改operator -=为采用该索引并删除该元素。
| 归档时间: |
|
| 查看次数: |
258 次 |
| 最近记录: |