gpt4 book ai didi

c++ - boost::lockfree::函数队列?

转载 作者:太空狗 更新时间:2023-10-29 21:34:59 26 4
gpt4 key购买 nike

我想构建一个简单的 boost::lockfree::queue不接受任何参数且不返回任何值的函数。

看来 boost::lockfree::queue要求项目类型可以轻松分配和破坏,要求 boost::function<void ()>不幸的是没有见面。

本着https://stackoverflow.com/a/21406186/393756的 spirit ,我现在正试图通过 boost::lockfree::queue 来实现这一目标普通函数指针:

boost::lockfree::queue<void (*)()> queue;

我可以推送 boost::function<void ()> 吗?进入这个队列?如果是,如何?

最佳答案

Can I push a boost::function<void()> into this queue?

不直接,如boost::function<void()>是一个重量级的类型删除包装器,不能隐式转换为函数指针并且还存储一些数据。

如果您需要一个可以引用任何函数对象的普通可赋值类型和普通可破坏类型,您可以实现 function_view指向某个函数对象但不拥有它的类。如果你小心生命周期并保证 function_view始终指向“事件对象”,您可以安全地将其实例存储在队列中。

从概念上讲,function_view是一对指针。我的 "passing functions to functions" 中有一个实现文章,我粘贴在下面:

template <typename TReturn, typename... TArgs>
class function_view<TReturn(TArgs...)> final
{
private:
using signature_type = TReturn(void*, TArgs...);

void* _ptr;
TReturn (*_erased_fn)(void*, TArgs...);

public:
template <typename T, typename = std::enable_if_t<
std::is_callable<T&(TArgs...)>{} &&
!std::is_same<std::decay_t<T>, function_view>{}>>
function_view(T&& x) noexcept : _ptr{(void*)std::addressof(x)}
{
_erased_fn = [](void* ptr, TArgs... xs) -> TReturn {
return (*reinterpret_cast<std::add_pointer_t<T>>(ptr))(
std::forward<TArgs>(xs)...);
};
}

decltype(auto) operator()(TArgs... xs) const
noexcept(noexcept(_erased_fn(_ptr, std::forward<TArgs>(xs)...)))
{
return _erased_fn(_ptr, std::forward<TArgs>(xs)...);
}
};

这个类通过了以下测试:

using type = function_view<void()>;
static_assert(is_trivially_assignable<type, type>{});
static_assert(is_trivially_destructible<type>{});

live example on wandbox

关于c++ - boost::lockfree::函数队列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44482613/

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