boost ::可选的抽象类类型

时间:2015-01-19 10:47:50

标签: c++ boost abstract-class optional

我想要一个抽象类型的可选对象。 但是,对于抽象类型,boost :: optional失败:

#include <boost/optional.hpp>
class A { 
  virtual int getInt() = 0; 
};
class B : public A {
  int getInt() { return 666; };
};

int main() {
  boost::optional<A> maybeAnA;
  boost::optional<A> another(maybeAnA);
};

结果

error: invalid new-expression of abstract class type ‘A’

仅仅使用指针似乎也不是一个可行的解决方案,因为某些函数需要返回一个包含可选值作为成员的对象,尽管期望函数的调用者是其所有者是不合逻辑的。该成员变量。

2 个答案:

答案 0 :(得分:9)

可选具有值语义,因此您无法执行所需操作,原因与您无法实例化A本身相同:

A anA;

因为您似乎对引用到可选值感兴趣,而不是拥有/包含

您可以选择包含引用:

  

此库允许模板参数T具有引用类型:T&,在某种程度上,T const&

     

但是,由于引用不是真实对象,因此某些限制适用,并且在这种情况下某些操作不可用:

     
      
  • 转换构造函数
  •   
  • 转换作业
  •   
  • InPlace建筑
  •   
  • InPlace作业
  •   
  • 通过指针进行价值访问
  •   

这种方式与传递A&但可选

时完全相同

<强> Live On Coliru

#include <boost/optional.hpp>

struct A { 
  virtual int getInt() = 0; 
};

struct B : A {
  int getInt() { return 666; }
};

#include <iostream>

int main() {
  boost::optional<A&> maybeAnA;

  B b;
  maybeAnA = b; // non owning, just the reference

  boost::optional<A&> another(maybeAnA);

  std::cout << another->getInt();
}

打印

666

如果您/ /希望optional充当该类型的容器,您确实应该使用unique_ptr<A>(它已经可以为空,可转让并拥有该资源)。

答案 1 :(得分:0)

你不能按照你想要的方式去做。

可选尝试创建A类型的成员(在您的情况下)并且无法执行此操作。

我想到的唯一解决方案就是存储(智能)指针。