如何删除向量中的 std::function<void()> ?

Hey*_*Hey 6 c++

我正在尝试用 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)

Nat*_*ica 4

如果您愿意限制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)

如果你不想这样做,那么你需要改变你的方法。您可以operator +=索引返回到插入的函数,然后您可以更改operator -=为采用该索引并删除该元素。有关如何将迭代器返回到函数的建议,请参阅eerorika 的答案。