Я хотел бы сделать что-то похожее на это:
#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.
Есть ли какая-либо другая опция для статического размещения списка, содержащего абстрактные объекты, с использованием элегантного списка фигурных скобок?
Задача ещё не решена.