模板事件类采取任何arg

时间:2018-04-24 02:25:26

标签: c++ c++11 c++17

我有一个简单的事件类,一切正常。

我试图添加一个模板类,我可以传递参数,然后在等待完成时读取它。

目前我只使用struct,因为我需要将arg设置为0,如果我不使用它。

有没有更好/更简单的方法来做到这一点,所以我可以传递任何类型的参数?

class Event
{
public:

    Event() : _signalled(false) {}

    virtual void notify()
    {
        std::unique_lock<std::mutex> lock(_mutex);
        _signalled = true;
        _condvar.notify_one();
    }

    virtual void wait()
    {
        std::unique_lock<std::mutex> lock(_mutex);
        _condvar.wait(lock, [&] { return _signalled; });
        _signalled = false;
    }

    void stop()
    {
        std::unique_lock<std::mutex> lock(_mutex);
        _signalled = false;
    }

private:

    std::mutex _mutex;
    std::condition_variable _condvar;
    bool _signalled;
};

template <class T>
class ArgEvent : public Event
{
public:

    void notify()
    {
        Event::notify();
        this->arg = { 0 };
    }

    void notify(T arg)
    {
        Event::notify();
        this->arg = arg;
    }

    T getArg()
    {
        return this->arg;
    }

    void wait()
    {
        Event::wait();
    }

    void wait(T& arg)
    {
        Event::wait();
        arg = this->arg;
    }

private:
    T arg;
};

1 个答案:

答案 0 :(得分:0)

Boost.Optional允许实现在没有c ++ 17的情况下工作。 https://www.boost.org/doc/libs/1_67_0/libs/optional/doc/html/index.html