指向具有不同参数的成员函数的指针的容器

2024-04-08

我到处寻找(现代 C++ 设计和合作),但我找不到一种好方法来存储一组接受不同参数并对不同类进行操作的回调。我需要这个,因为我希望应用程序的每个对象都有可能将其方法之一的执行推迟到主对象Clock对象,跟踪当前时间,可以在正确的时刻调用此方法。我的目标代码是这样的:

In the void executeAction1Deferred(int time, int arg1, bool arg2)的方法class1,其中 time 是将来想要的执行时间,应该是这样的:

Clock::defer(time, Class1::action1, this, arg1, arg2);

In Clock::defer(??? what signature ????)表示此任务的对象存储在优先级队列中,其中时间是键。对于每一个Clock量子然后遍历任务列表,并且将执行该量子中需要运行的任务。请注意,我使用“defer”作为静态函数,因为我打算Clock单例对象,但也可以是成员函数,这只是选择问题。

我想过使用void*保留可变数量的参数,但有我的action1()方法接受一个void*非常糟糕,还因为每次我直接使用这个函数而不延迟它时,我都需要为参数制作一个结构。

过去我多次遇到过这个问题,但从未找到真正合适的解决方案。请注意,由于这是一个小型多平台项目,对于没有经验的程序员来说,构建简单性以扩展它是至关重要的,我不想使用 boost。但是,我们所解决的平台的每个编译器都有std::tr1绑定。问题是:如何定义一个泛型函数的容器,每个泛型函数接受可变数量的参数(最多 N ~ 5),并且是不是从公共虚拟类派生的对象的不同成员方法?谢谢


Use std::function<void()>存储调用,然后使用可变参数模板参数转发和绑定函数参数:

class Clock
{
    vector<function<void()>> tasks;

    template<class F, class... Args>
    void defer(F f, Args&&... args)
    {
        tasks.push_back(bind(f, forward<Args>(args)...);
    }

}

void f(A a, B b);

int main()
{
    A a;
    B b;

    Clock c;
    c.push_back(f, a, b);
}

也可以看看std::bind and std::mem_fun

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

指向具有不同参数的成员函数的指针的容器 的相关文章

随机推荐