代码之家  ›  专栏  ›  技术社区  ›  jjmcc

当类型和参数长度可能不同时,如何将“带参数的函数”作为参数传递?

c++
  •  1
  • jjmcc  · 技术社区  · 7 年前

    我试图在C++中为我的应用程序创建一个基本的同步任务调度器。 Task 对象,然后 TaskScheduler 可以对它们进行操作,而不是处理多个类型。

    class Task {
    public:
        Task( ... ? /* some sort of callback function stored in the task which is called at a later time*/) {}
    
        virtual void Execute() = 0;
    }
    

    这个 任务 将负责存储每个任务上发生的事情,我正在考虑将函数传递给 任务 对象,或者执行,但这里是我被卡住的地方。 例如,如果我有两个任务 IntegerTask : Task StringTask : Task 它们的回调函数看起来像 func(int, int, int) func(std::string) 分别。

    当参数的长度可能不同,并且每个参数的类型可能因创建的任务而异时,如何将这些函数传递给基本任务?

    我不想要 任务调度程序 为了与类之外的任何事物耦合,因此它应该能够独立地操作,而不需要任何依赖性。请你问我是否需要澄清,我尽量解释清楚。这在C++中是可能的吗?还是有更好的解决方法?

    1 回复  |  直到 7 年前
        1
  •  4
  •   Matthieu Brucher    7 年前

    使用 std::function<void()> 与兰姆达斯合作:

    class Task
    {
        std::function<void()> task;
    public:
        Task(std::function<void()> task):task(std::move(task)){}
    
        void execute() {task();}
    };
    

    然后,要创建具有不同“类型”的任务,只需执行以下操作:

    std::string foo = "foo";
    
    Task task1([=]() {  foo.size(); } );
    task1.execute();
    
    int bar = 0;
    
    Task task2([=]() {  bar; } );
    task2.execute();
    

    注意我正在使用 [=] 在这里。这将复制lambda中所需的值,这样我就不必处理对象生存期了。如果知道对象始终存在,则可以使用 [&] 或者两者的结合。