将任意函数对象存储到类成员容器中,而不知道它们的声明签名

时间:2018-03-22 15:10:48

标签: c++ templates vector c++17 std-function

我有一个类模板,我不知道我是否需要将其作为其中一个参数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 obj?是std::forward还是std::move?是否应将要添加到对象中的方法声明为Func&& func

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

修改

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

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

1 个答案:

答案 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>