C ++中抽象类容器的支撑列表初始化

时间:2015-07-18 11:47:48

标签: c++ stl abstract-class design-by-contract

我想做类似的事情:

#include <list>
#include <iostream>
#include <functional>

class Abstract {
public:
  virtual void foo() = 0;
};

class Concrete : public Abstract {
  void foo() {
    std::cout << "foo's implementation" << std::endl;
  }
};

typedef std::list<Abstract> abstract_list;

class Someclass {
public:
  Someclass(abstract_list list) : m_list(list) {}
private:
  abstract_list m_list;
};

int main(int argc, char **argv) {
  Someclass l({ Concrete(), Concrete() });
  return 0;
}

现在,我知道我不能。摘要不完整,不能在容器中使用。我不想使用指针(raw ppointer或unique_ptr)。

我尝试将我的类型重写为:

typedef std::list<std::reference_wrapper<Abstract> > abstract_list;

但它失败了

error: use of deleted function ‘std::reference_wrapper<_Tp>::reference_wrapper(_Tp&&) [with _Tp = Abstract]’

因为std :: reference_wrapper不能与rvalue一起使用。

是否还有其他选项可以使用优雅的支撑初始化列表静态分配包含抽象实体的列表?

0 个答案:

没有答案