gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 14:50:09 24 4
gpt4 key购买 nike

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

class1void executeAction1Deferred(int time, int arg1, bool arg2)方法中,time是 future 想要的执行时间,应该有一些东西像这样:

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

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

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

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

最佳答案

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

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::bindstd::mem_fun

关于c++ - 指向具有不同参数的成员函数的指针的容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13703980/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com