我有一个类模板,我不知道我是否需要将其作为其中一个参数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;
答案 0 :(得分:0)
为什么这个类存储std::thread
s 和 Data
s 和 Func
?
你可以使用Callable启动哪些线程?
Func
的实例适用于Data
?
thread
s。Func
的实例应用于传递的参数,以便生成Data
?
std::future<Data>
s(可能还有thread
s,具体取决于您创建期货的方式)Func
实例?
std::packaged_task<Data(Args...)>
并分发那些已创建的std::future<Data>
。