为 类 复制 shared_ptr<Interface> 的行为类似于值

Copying shared_ptr<Interface> for classes that act like values

这是我的问题。我有一个接口和两个派生的 classes:

class Interface
{
public:
    virtual void f() = 0;
};
class Derived1 : public Interface;
class Derived2 : public Interface;

然后,我还有一个包含 shared_ptr 的值 class,其目的是指向两个派生的 classes:

之一
class Value
{
public:
     Value();
     Value(const Value&);
private:
     shared_ptr<Interface> p_;
};

因为我希望我的 Value class 像一个值一样工作,所以我希望我的复制构造函数复制指向的 Derived 对象。但是,我不会写

Value::Value(const Value& value) : 
    p_(make_shared<Interface>(*value.p_))
{ }

as 接口包含纯虚函数。 *value.p_ 必须是派生类型。我不知道如何正确处理这个问题。

提前致谢。

I don't know how to manage this problem properly.

为什么不使用虚拟 clone() 方法?

class Interface
{
public:
  virtual void f() = 0;
  virtual std::shared_ptr<Interface> clone()=0;
};

class Derived1 : public Interface {
    void f() {};
  std::shared_ptr<Interface> clone()
  {
    return std::make_shared<Derived1>(*this);
  }
};

然后在你的复制构造函数中,你可以使用类似下面的东西来复制指针:

Value::Value(const Value& value)
{
    this->p_ = value.p_->clone();
}

以这个为例:http://www.cs.technion.ac.il/users/yechiel/c++-faq/copy-of-abc-via-clone.html

这个问题正是提议的 polymorphic_value 旨在解决的问题(它赋予多态对象值语义)。

polymorphic_value<T> 可以拥有并执行从 T.

派生的对象的深拷贝

ISO C++ 提案在这里 http://wg21.link/p0201

参考实现在这里https://github.com/jbcoe/polymorphic_value

我是论文和参考实现的作者。

我发现 polymorphic_value 在删除大量难以编写的样板代码方面很有用。我很想知道它是否也能解决您的问题。