将任意函数对象存储到类成员容器中,而无需知道其声明签名



我有一个类模板,我不知道我是否需要将其参数之一作为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 objectfunction pointerlambdastd::function<...>} 时,我也类似,我可以类似地声明function的参数吗?

还是我应该只使用实际的template参数本身?

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

如果这里的第二种情况是首选方式,那么我将如何实际存储func objstd::forward还是std::move更可取?是否应该将添加对象的方法声明为Func&& func

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


编辑

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

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

为什么这个类存储std::threadsDatasFuncs?

你用什么可调用的线程开始这些线程?

应用于
  • DataFunc实例?
    • 您只需要thread
  • Func应用于传递参数的实例,以便生成Data
    • 存储std::future<Data>(可能thread,具体取决于您如何创建期货)
  • 您将在将来某个时候调用的Func实例?
    • 存储std::packaged_task<Data(Args...)>并分发创建的std::future<Data>

最新更新