c++ 如何初始化std::stop_callback?

mwngjboj  于 2023-04-01  发布在  其他
关注(0)|答案(1)|浏览(164)

下面的代码中初始化std::stop_callback的正确方法是什么?

class watch_dog
{
public:

    watch_dog(std::stop_token token) :
        m_token(token),
        m_callback(m_token, std::bind(&watch_dog::callback_proc, this))
    {
    }

private:

    void callback_proc()
    {
        std::cout << "an operation has completed." << std::endl;
    }

    std::stop_token m_token;

    std::stop_callback m_callback;
};

C++中有没有一种方法可以不使用std::stop_callback类来注册回调函数?
如何确定要将m_callback声明为的std::bind的类型

std::stop_callback<type of my std::bind> m_callback;

wmomyfyw

wmomyfyw1#

stop_callback未被类型擦除;它是一个模板,存储了你要调用的可调用对象的确切类型。如果你想擦除存储的类型,那么它存储的可调用对象需要执行擦除操作。比如std::function

std::stop_callback<std::function<void()>> m_callback;

它应该能够存储std::bind的结果。
您甚至可以创建一个方便的模板别名:

template<typename Func>
using stop_callback_func = std::stop_callback<std::function<Func>>;

...

stop_callback_func<void()> m_callback;

相关问题