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

Ale*_*nik 0 c++ templates scheduling callback generic-programming

我到处寻找(Modern C++ design&co),但我找不到一种很好的方法来存储一组接受不同参数并在不同类上运行的回调.我需要这个,因为我希望我的应用程序的每个对象都有可能将其中一个方法的执行推迟到一个主Clock对象,跟踪当前时间,可以在正确的时刻调用这些方法.我的目标代码是:

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

Clock::defer(time, Class1::action1, this, arg1, arg2);
Run Code Online (Sandbox Code Playgroud)

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

我曾经想过void*用来保存一个可变数量的参数,但让我的action1()方法接受一个void*非常可怕,也因为每次我直接使用这个函数时我都需要为参数创建一个结构而不推迟它.

我过去曾经多次面对这个问题,而且我从未找到过一个非常好的解决方案.请注意,作为一个小型的多平台项目,为缺乏经验的程序员构建简单性可以扩展它是必不可少的,我不想使用boost.但是,我们解决的平台的每个编译器都std::tr1绑定了.问题是:如何定义泛型函数的容器,每个容器接受可变数量的参数(最多N~5),并且是不是从公共虚拟类派生的对象的不同成员方法?谢谢

And*_*zos 7

使用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);
}
Run Code Online (Sandbox Code Playgroud)

又见std::bindstd::mem_fun