gpt4 book ai didi

c++ - 如何删除 vector 中的 std::function

转载 作者:行者123 更新时间:2023-12-01 13:00:03 25 4
gpt4 key购买 nike

我正在尝试用 C++ 为我的游戏引擎创建 C# 事件。我现在正在实现事件系统,但我不知道如何删除 vector 中的 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();
}

最佳答案

Is this possible in C++?



不是这样的。不能比较函数包装器的相等性。这是他们设计的一个限制。

一种选择是使用函数指针。可以比较它们的相等性。但是你不能使用有状态的函数对象。 NathanOliver 展示了一个例子。

另一种替代设计是使用 std::list作为容器,当你注册一个函数时,将迭代器返回给它。然后,您可以传递要删除的迭代器,而不是通过传递函数进行删除。

关于c++ - 如何删除 vector 中的 std::function<void()> ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60212046/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com