存储模板参数包作为非类模板的属性

Store template parameter pack as a attribute of a non class template

本文关键字:属性 包作 参数 存储      更新时间:2023-10-16

是否可以存储传递给非类模板的构造函数的variadic模板参数/参数pack作为该类的属性,而无需将该阶级变成一个类模板?

我目前正在开发一个薄包装类别(我在这里仅创建了一个最小的示例以最大程度地减少复杂性),该签名:

class Wrapper final {
 public:
  template <typename Function, typename... Args>
  auto start(Function&& function, Args&&... args) -> void;
};

参数包将传递给成员函数模板start<Function, ... Args>,目前无需"存储" functionargs。完美的转发用于该功能内的进一步处理。

现在,我想实现的是一个签名,如下所示(介绍接口类):

class WrapperInterface {
 public:
  virtual ~WrapperInterface() = default;
  virtual auto start() -> void = 0;
};
// TODO(2019-03-17 by wolters) The following is non-working pseudo-code.
class Wrapper final : public WrapperInterface {
 public:
  template <typename Function, typename... Args>
  explicit Wrapper(Function&& function, Args&&... args)
      : function_{function}, args_{args} {
    // NOOP
  }
  auto start() -> void {
    // TODO(2019-03-17 by wolters) Invoke `function_` with `args_`.
    function_(args);
  }
 private:
  std::function<???> function_;
  std::tuple<???> args_;
};

然后Wrapper可以用如下:

class WrapperClient final {
 public:
  WrapperClient() : wrapper_{[this](){
    // std::cout << "startedn";
  }} {
    // NOOP
  }
 private:
  Wrapper wrapper_;
};

尽管在上面的示例中不需要接口类,但通常需要将实例存储在 std::vector<std::unique_ptr<WrapperInterface>>中。

我已经阅读并尝试了如何存储variadic模板参数?,但是这种方法需要将 Wrapper变成类模板。

我认为需要与QThread *QThread::create(Function &&f, Args &&... args)实现相似的东西。可悲的是,该代码对我来说太好了。

您可以指导我走向正确的方向吗?是否可以使用私人实施类模板?

您要做的是称为type-ersusure,这是一种非常有趣的技术(例如,这里是一个无耻的自我启示),但是在std::function中已经为您完成了您要做的就是使用std::function<void()>并使用std::bind或Lambda捕获来存储参数:

template <typename Function, typename... Args>
std::function<void()> wrap(Function&& function, Args&&... args)
{
    return [=] { function(args); };
    // or return std::bind(std::forward<Function>(function), std::forward<Args>(args)...);
}