【发布时间】:2012-12-04 13:24:55
【问题描述】:
我到处寻找(现代 C++ 设计和合作),但我找不到存储一组接受不同参数并在不同类上操作的回调的好方法。我需要这个,因为我希望我的应用程序的每个对象都有可能将其方法之一的执行推迟到主 Clock 对象,该对象跟踪当前时间,可以在适当的时候调用此方法。我的目标是这样的代码:
在class1的void executeAction1Deferred(int time, int arg1, bool arg2)方法中,time是未来想要的执行时间,应该是这样的:
Clock::defer(time, Class1::action1, this, arg1, arg2);
在Clock::defer(??? what signature ????) 中,代表此任务的对象存储在优先级队列中,其中时间是键。对于每个Clock 量子,然后遍历任务列表,并执行需要在此量子中运行的任务。请注意,我使用“defer”作为静态函数,因为我打算使用单例的 Clock 对象,但它也可以是成员函数,这只是选择问题。
我曾想过使用void* 来保留可变数量的参数,但是让我的action1() 方法接受void* 非常糟糕,因为我每次都需要为参数制作一个结构我直接使用这个函数,没有延迟。
过去我曾多次面临这个问题,但我从未找到真正体面的解决方案。请注意,作为一个小型多平台项目,对于没有经验的程序员可以扩展它的简单性是必不可少的,我不想使用 boost。但是,我们处理的平台的每个编译器都有std::tr1 绑定。问题是:如何定义一个泛型函数的容器,其中的每一个都接受可变数量的参数(最多 N ~ 5 个),并且是不从公共虚拟类派生的对象的不同成员方法?谢谢
【问题讨论】:
-
为什么要存储采用不同参数集的函数?你想怎么称呼那些?据我了解您的问题,您可以只绑定除一个参数(时间)之外的所有参数 - 然后您的集合将存储所有具有相同签名的函数(需要时间),但在内部可能会包装具有不同签名的函数。
-
你可以使用variable argument list作为签名,让每个方法处理参数是什么。
-
@aleguna 不抱歉...仅限 tr1
标签: c++ templates callback scheduling generic-programming