将自定义函数传递给基本抽象类以延迟执行

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

我想学习如何对Task类进行抽象,该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();
    }

}

编辑:

Varadic在这里确实是针头。那就是我目前最终得到的代码:

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

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

class GameTask : public ITask
{
public:
    GameTask(std::function<void()> func) : func_(func) {}

    void execute() final
    {
        func_();
    }

private:
    std::function<void()> func_;
};

// lets imitate some bigger classes with various methods
class BigClassA
{
public:
    void func1(int a) const { 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;

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

    queue.push(std::make_unique<GameTask>( [&a, &b]() {b.func1(a, 3); } ));

    queue.push(std::make_unique<GameTask>( [&a]() { a.func2("Hello"); } ));


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

}

我想听听我可以添加的每一项改进。

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

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

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