一种传递自定义函数以供以后执行的有效方法C ++

问题描述 投票:1回答:1

我想拥有一些抽象Task类,该类可以采用任何函数或某种对象方法(连同其参数等)并存储以供以后执行,或将其分发到某些线程上,无论如何。

我已经用std :: function做了一些实验,但是还没有成功。因此,我想使其运行或熟悉一些更有效的模式以满足我的需求。

#include <iostream>
#include <string>
#include <queue>
#include <memory>
#include <functional>

class ITask
{
    public:
    virtual ~ITask() = default;
    virtual void execute() = 0;
};

template<typename ReturnType, typename... Args>
class GameTask : ITask
{
    explicit GameTask(std::function<ReturnType(Args...)>& func) :
        func_(func)
    {}

    void execute()
    {
        // func(Args...); ??
    }

private:
    std::function<ReturnType(Args...)> func_;
};


// lets imitate some bigger classes with various methods
class BigClassA
{
public:
    void func1(int a) { std::cout << ++a; }
    int func2(const std::string& s) { std::cout << s; return b; }

    int b = 4;
};

class BigClassB
{
public:
    double func1(BigClassA& bca, int i) { bca.b += i; return 0.1; }
};

int main()
{
    BigClassA a;
    BigClassB b;

    // perform immidiately by current main thread:
    a.func1(2);
    b.func1(a, 3);
    a.func2("Hello");


    //store under queue for later execution
    std::queue<std::unique_ptr<ITask>> queue;

    /*  a.func1(2);  */
    // queue.push(std::make_unique<GameTask>( [&a](){ a.func1(2); } ));

    /*  b.func1(a, 3);  */
    //  queue.push(std::make_unique<GameTask>(  ));

    /*  a.func2("Hello");  */
    // queue.push(std::make_unique<GameTask>(  ));


    while (queue.size())
    {
        queue.front()->execute();
        queue.pop();
    }

}
c++ design-patterns c++17 std std-function
1个回答
0
投票

这里是代码的有效版本,但进行了一些更改。尽管可以对设计进行很多改进,但我只是将您的代码更改为可以编译和工作。

© www.soinside.com 2019 - 2024. All rights reserved.