当类型和参数长度可能不同时,如何将“带参数的函数”作为参数传递? 我试图在C++中为我的应用程序创建一个基本的同步任务调度程序。我想做的是把每个任务当作任务对象,然后任务调度程序可以对它们进行操作,而不是处理多个类型。 class Task { public: Task( ... ? /* some sort of callback function stored in the task which is called at a later time*/) {} virtual void Execute() = 0; }

当类型和参数长度可能不同时,如何将“带参数的函数”作为参数传递? 我试图在C++中为我的应用程序创建一个基本的同步任务调度程序。我想做的是把每个任务当作任务对象,然后任务调度程序可以对它们进行操作,而不是处理多个类型。 class Task { public: Task( ... ? /* some sort of callback function stored in the task which is called at a later time*/) {} virtual void Execute() = 0; },c++,C++,任务将负责存储在每个任务上发生的事情,我正在考虑将函数传递给任务对象的构造函数或执行,但这就是我遇到的问题。 例如,如果我有两个任务IntegerTask:Task和StringTask:Task,它们的回调函数分别看起来像funcint、int、int和funcstd::string 当参数的长度可能不同,并且每个参数的类型可能根据创建的任务而变化时,如何将这些函数传递给基本任务 我不希望TaskScheduler与其类之外的任何东西耦合,因此它应该能够在没有任何依赖项的情况下独立运行。请询问

任务将负责存储在每个任务上发生的事情,我正在考虑将函数传递给任务对象的构造函数或执行,但这就是我遇到的问题。 例如,如果我有两个任务IntegerTask:Task和StringTask:Task,它们的回调函数分别看起来像funcint、int、int和funcstd::string

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


我不希望TaskScheduler与其类之外的任何东西耦合,因此它应该能够在没有任何依赖项的情况下独立运行。请询问是否有任何需要澄清的地方,我尽力解释。这是否可能在C++中,或者对于我正在尝试实现的问题有更好的解决方案吗?< /p> ,而不是提供一个复杂的类,带有虚调用,使用与LAMBDAS相关联的STD::函数:

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

    void execute() {task();}
};

请注意,我在这里使用[=]。这将在lambdas中复制所需的值,因此我不必处理对象生存期。如果您知道对象始终存在,则可以使用[&]或两者的组合。

而不是提供带有虚拟调用的复杂类,请将std::function与lambdas结合使用:

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

    void execute() {task();}
};

请注意,我在这里使用[=]。这将在lambdas中复制所需的值,因此我不必处理对象生存期。如果您知道对象始终存在,可以使用[&]或两者的组合。

@MatthieuBrucher谢谢您的回复。所以它们通常不应该运行任何参数?@MatthieuBrucher噢,哇,那正是我当时想要的!我将尝试一下,看看它是如何工作的。为什么要传递一个具有未知参数列表的函数?你不能叫它@谢谢你的回复。所以它们通常不应该运行任何参数?@MatthieuBrucher噢,哇,那正是我当时想要的!我将尝试一下,看看它是如何工作的。为什么要传递一个具有未知参数列表的函数?你不能叫它!