gpt4 book ai didi

c++ - 在不知道声明签名的情况下将任意函数对象存储到类成员容器中

转载 作者:太空宇宙 更新时间:2023-11-04 12:50:10 26 4
gpt4 key购买 nike

我有一个类模板,但我不知道是否需要将其作为参数之一 class Func或不。我也不知道我是否可以任意存储一个 std::function直接进入没有模板参数参数列表的容器。我的类(class)看起来像:

template<class Data, class Func>
class ThreadManager final {
private:
std::vector<std::shared_ptr<Data>> storedDataPtrs;
std::vector<std::shared_ptr<std::thread>> storedThreadPtrs;

// Is this valid? I know that `std::function is a class template wrapper
// that depends on template argument types. However I do not know
// what kind of func will be stored...
std::vector<std::shared_ptr<std::function>> storedFunctionPtrs;

public:
ThreadManager() = default;
~ThreadManager() = default; // will change to clean up containers.
ThreadManager( const ThreadManager & c ) = delete;
ThreadManager& operator=( const ThreadManager & c ) = delete;
};

当我编写将添加数据、线程和函数对象的函数时也类似{ function object , function pointer , lambda , std::function<...>我可以为 function 声明参数吗?相似地?

或者我应该只使用实际的 template争论本身?

 std::vector<std::shared_ptr<Func>> storedFuncPtrs;

如果这里的第二种情况是首选方式,那么我将如何实际存储 func obj ?会 std::forwardstd::move被优先考虑?添加对象的方法是否应声明为 Func&& func

我希望尽可能保持此类的通用性、模块化和可移植性,同时尝试维护现代 c++17 最佳实践。


编辑

在听取了用户 Liliscent 的建议后,我认为这就是她在整个评论中所说的内容。

std::vector<std::function<Func>>  _storedFuncObjs;

最佳答案

为什么这个类存储std::thread s Data s Func是吗?

您使用什么 Callable 启动这些线程?

  • 实例Func适用于Data
    • 您只需要 thread s.
  • 实例Func应用于传递的参数,例如 Data被生产?
    • 商店 std::future<Data> s(可能还有 thread s,取决于您如何创建 future )
  • 实例Func你会在未来的某个时间点打电话吗?
    • 商店 std::packaged_task<Data(Args...)>并分发 std::future<Data>是那些被创造出来的。

关于c++ - 在不知道声明签名的情况下将任意函数对象存储到类成员容器中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49432181/

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