unique_ptr upcast作为回报

时间:2013-08-17 11:24:56

标签: c++11 polymorphism unique-ptr upcasting

我有这个函数应该生成不同的派生obj并返回unique_ptr<base>

class base {};  // contains pure functions.
class derived1 {}; // reifies that pure iface.
class derived2 {}; // reifies that pure iface.

unique_ptr<base> factory::load(int param)
  {
    switch (param)
      {
      case PARAM_MAIN:
        return new derived1();
        // return std::move(new derived1());

      case PARAM_2:
        return new derived2();

      case ...:
        return new derived...();

      }
  }

即使使用std :: move,也无法让这件事情发生。 (也使用了dynamic_cast,但可能做错了。)

这是我得到的错误:(Archclinux上的gcc(GCC)4.8.1 20130725(预发布))

could not convert '(std::shared_ptr<base::model>((*(const std::shared_ptr<base::model>*)(& associatedModel))), (operator new(48ul), (<statement>, ((derived1*)<anonymous>))))' from 'derived1*' to 'std::unique_ptr<base>'
            associatedModel));

我希望我清楚自己想做什么。

我该怎么办?感谢。

2 个答案:

答案 0 :(得分:4)

您可以unique_ptr<derived1>(new derived1());甚至更好(使用C ++ 14)使用std::make_unique

using namespace std;

class base {};  // contains pure functions.
class derived1 {}; // reifies that pure iface.
class derived2 {}; // reifies that pure iface.

unique_ptr<base> factory::load(int param) {
  switch (param) {
    case PARAM_MAIN: return make_unique<derived1>();
    case PARAM_2:    return make_unique<derived2>();
    case ...:        return make_unique<derived...>();
  }
}

答案 1 :(得分:-5)

我这样解决了:

return unique_ptr<base>(dynamic_cast<base*>(std::move(
               new derived1()
       )));

所以关键是它必须被提升到base,而它仍然是原始的,然后才被包裹在unique_ptr中。

无论如何,我感谢更简单的答案。特别是那些基于unique_ptr的内部和实现的推理。