复制具有可子类化的成员的类的构造函数

Copy Constructor for class with a member that can be subclassed

提问人:Spiros Tsalikis 提问时间:3/24/2022 最后编辑:Spiros Tsalikis 更新时间:3/24/2022 访问量:87

问:

我正在使用以下类,该类具有一个成员来构造一个可以使用模板进行子类化的列表。

class dynamic_list
{
  template <typename = void>
  struct node
  {
    std::unique_ptr<node<>> next;

    virtual ~node() = default;
    virtual std::unique_ptr<node<>> clone() const = 0;
  };

  template <typename T>
  struct typed_node : node<>
  {
    T value;

    constexpr typed_node(const typed_node<T>& node)
     : value(node.value)
    {
    }

    template <typename Arg>
    constexpr typed_node(const Arg& arg)
     : value(arg)
    {
    }
    
    std::unique_ptr<node<>> clone() const override
    {
      return std::unique_ptr<typed_node<T>>(new typed_node<T>(*this));
    }
  };

  std::unique_ptr<node<>> head_;

public:
  constexpr dynamic_list() = default;

  template <typename T, typename Arg>
  const T& push(const Arg& arg)
  {
    auto new_node = std::unique_ptr<typed_node<T>>(new typed_node<T>(arg));
    auto& value = new_node->value;
    new_node->next = std::move(head_);
    head_ = std::move(new_node);
    return value;
  }
};

我正在尝试为这个类编写一个复制构造函数,到目前为止,我有以下内容,但它不起作用:


  dynamic_list(const dynamic_list& list)
  {
    if (list.head_)
    {
      head_ = list.head_->clone();
      auto temp = head_.get();
      auto list_temp = list.head_.get();
      while (list_temp->next)
      {
        temp->next = list_temp->next->clone();
        temp = temp->next.get();
        list_temp = list_temp->next.get();
      }
    }
  }

任何帮助将不胜感激

C++ 模板 复制构造函数 克隆

评论

3赞 user4581301 3/24/2022
方便阅读:C++ 11 的 decltype 是否使克隆变得不必要?它告诉你为什么你正在做的事情不起作用,并强烈暗示“克隆”作为一种解决方案
2赞 Remy Lebeau 3/24/2022
附带说明:用于该领域是危险的。当列表被销毁时,您将进入一个销毁所有节点的递归循环,如果列表很大,那么在运行时可能会出现堆栈溢出错误,所有这些嵌套的析构函数调用都会被推送到调用堆栈上。销毁每个节点的迭代循环比递归循环更安全。unique_ptrnode::next
0赞 Raymond Chen 3/24/2022
您可能需要考虑使用 .std::any
0赞 Spiros Tsalikis 3/24/2022
@RaymondChen std::any 以什么方式?
0赞 Spiros Tsalikis 3/24/2022
@RemyLebeau我的清单很可能不会那么大,但我会考虑你说的。

答: 暂无答案