我有一个类模板,我不知道我是否需要将其参数之一作为class Func
。我也不知道我是否可以在没有模板参数参数列表的情况下将std::function
直接任意存储到容器中。我的班级看起来像这样:
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::forward
还是std::move
更可取?是否应该将添加对象的方法声明为Func&& func
?
我希望使这个类尽可能通用、模块化和可移植,同时尝试保持现代 c++17 最佳实践。
编辑
在听取了用户Liliscent的建议后,我认为这就是她在整个评论中所说的。
std::vector<std::function<Func>> _storedFuncObjs;
为什么这个类存储std::thread
s和Data
s和Func
s?
你用什么可调用的线程开始这些线程?
应用于Data
的Func
实例?- 您只需要
thread
。
- 您只需要
Func
应用于传递参数的实例,以便生成Data
?- 存储
std::future<Data>
(可能thread
,具体取决于您如何创建期货)
- 存储
- 您将在将来某个时候调用的
Func
实例?- 存储
std::packaged_task<Data(Args...)>
并分发创建的std::future<Data>
。
- 存储