其他分享
首页 > 其他分享> > c-指向具有不同参数的成员函数的指针的容器

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

作者:互联网

我到处都在寻找(现代C设计与合作公司),但是我找不到一种好的方法来存储一组接受不同参数并在不同类上运行的回调.我之所以需要这样做,是因为我希望应用程序的每个对象都可以将其方法之一的执行推迟到主Clock对象上,该主Clock对象可以跟踪当前时间,可以在适当的时候调用此方法.我所针对的代码大致如下:

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

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

在Clock :: defer(???什么签名????)中,代表此Task的对象存储在优先级队列中,其中时间是键.然后,将遍历每个“时钟”任务列表,然后执行需要在该任务中运行的任务.请注意,我已经将“ defer”用作静态函数,因为我打算使用Singleton的Clock对象,但是它也可以是成员函数,这只是选择的问题.

我曾考虑过使用void *来保留可变数量的参数,但是让我的action1()方法接受void *确实很糟糕,这还因为每次我直接使用此函数时都需要为参数构造一个结构而不会推迟.

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

解决方法:

使用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和std :: mem_fun

标签:generic-programming,c,templates,scheduling,callback
来源: https://codeday.me/bug/20191010/1884446.html