【问题标题】:Storing variadic unique_ptr pack into a tuple将可变参数 unique_ptr 包存储到元组中
【发布时间】:2023-02-26 19:14:54
【问题描述】:

我正在尝试编写一个构造函数,它将 unique_ptrs 的可变参数包作为参数并将其存储在一个元组中:

template<class... E>
    class A
    {
        std::tuple<std::unique_ptr<E>...> a_;

    public:
        A(std::unique_ptr<E>&&... a)
           : a_(std::make_tuple(std::move(a)...)) {}
  
    };

但是当我用一个以上的参数调用构造函数时编译失败——例如

A< double> obj(std::make_unique<double>(2.0), std::make_unique<double>(3.0));

无法编译并在 tuple::test_method() 中出现错误。

我的问题是:

  1. 我正在尝试做的事情有什么本质上的错误吗?
  2. 可行吗?

    谢谢

【问题讨论】:

  • 您的构造函数应该引用 a 而不是 schemes(未定义?),并且您的对象应该是 A&lt;double, double&gt; 而不是 A&lt;double&gt;。但除此之外,似乎对我来说工作正常。
  • 你说得对。使用schemes 是一个拼写错误(现已编辑)。问题出在 &lt;double&gt;&lt;double, double&gt; 中。如果您将其作为答案发布,我会接受。谢谢!
  • 你的意思是A&lt;double, double&gt;,因为你存储了两个unique_ptr&lt;double&gt;s。
  • 是的,这就是我的意思。

标签: c++ variadic-templates


【解决方案1】:

在这种情况下,问题似乎只是您的变量类型为A&lt;double&gt;,但您传递的是两个值,因此您需要使用A&lt;double, double&gt;

A<double, double> obj(std::make_unique<double>(2.0), std::make_unique<double>(3.0));

或者,如果使用 auto 声明变量,则可以消除声明模板参数的需要。

auto obj = A(std::make_unique<double>(2.0), std::make_unique<double>(3.0));

【讨论】:

    【解决方案2】:

    Cruz Jean 提供的答案完美而简单,尤其是在使用 auto 时。 另一方面,最初的问题表明 Nicola 非常缺乏努力。用 C++ 做了五年的模板,还在寻求其他人的帮助来编译他的代码?也许在尝试更复杂的事情之前学习基础知识会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-21
      • 1970-01-01
      • 2018-02-20
      • 1970-01-01
      • 2019-05-19
      • 2017-10-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多