gpt4 book ai didi

c++ - 标准库中是否有匹配 std::thread 的构造函数语义的类型删除函数包装器?

转载 作者:行者123 更新时间:2023-11-30 01:08:05 26 4
gpt4 key购买 nike

我需要创建一个非模板类¹,它需要保存一个可调用对象及其参数,以便稍后调用它们。

由于此类正在为异步执行建模,我想为其提供与 std::thread 相匹配的 API 和语义。/std::async :

class Async {
public:
template <typename Function, typename... Args >
explicit Async(Function&& f, Args &&... args)
{
// perform a (decay) copy of the args,
// store f and the copy somewhere
}

void call()
{
// to be possibly called in a different thread;
// call the function stored. no need to return the results
}

private:
// which data members?
};

我首先想到的是使用 std::function<void()>作为唯一的数据成员,并从 std::bind 初始化它在争论中。

但是,这不起作用:std::functionstd::bind不支持仅移动类型,并且 std::bindstd::invoke 而言根本不起作用(并且它做了很多额外的魔法,比如递归解析绑定(bind))。

我是否缺少标准库中提供的一些易于实现的解决方案来实现这一点,或者我应该部署我自己的绑定(bind)器和类型删除函数包装器类?


¹ 长话短说:此类需要从具有虚方法的基类继承,因此将此类作为模板类会导致通常的代码膨胀和冲突,因为到处都是重复的虚表和虚方法。

最佳答案

template<class T> T&& wrap_pm(T&& t) { return std::forward<T>(t); }
template<class T, class U>
auto wrap_pm(U T::* p) -> decltype(std::mem_fn(p)) { return std::mem_fn(p); }

class Async {
public:
template <typename Function, typename... Args >
explicit Async(Function&& f, Args &&... args)
: fut(std::async(std::launch::deferred,
[f=std::forward<Function>(f)](auto&&... args) mutable
{
wrap_pm(std::move(f))(decltype(args)(args)...);
}, std::forward<Args>(args)...))
{ }
void call()
{
fut.get();
}

private:
std::future<void> fut;
};

我不保证效率。

关于c++ - 标准库中是否有匹配 std::thread 的构造函数语义的类型删除函数包装器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43240891/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com