我正在寻找这个问题的解决方案:
我有一个父类MyParent
和几个继承自MyParent
的子类。我希望能够根据索引构造一个选定的类。例如,假设我有4个子类,它们在名为classesList的列表中,我希望能够调用classesList[2]();
,其中2是所选类的索引。
我想知道如何制作这个列表,它应该有什么类型?我不希望在列表中实际初始化类,我只想要对构造函数的引用,以便只有当我从列表中选择索引时才构造它。
答案 0 :(得分:3)
你可以有一个函数指针列表:
struct Base { virtual ~Base() {} };
struct X1 : Base { /* ... */ };
struct X2 : Base { /* ... */ };
struct X3 : Base { /* ... */ };
// ...
std::unique_ptr<Base> makeX1() { return std::unique_ptr<Base>(new X1); }
std::unique_ptr<Base> makeX2() { return std::unique_ptr<Base>(new X2); }
std::unique_ptr<Base> makeX3() { return std::unique_ptr<Base>(new X3); }
// ...
std::vector<std::unique_ptr<Base>(*)()> makers = { makeX1, makeX2, makeX3 };
用法:
void f(std::size_t class_index)
{
auto p = makers[class_index]();
// use p
}