我有一个父班和多个子班。我想根据输入动态创建不同类的子对象。
假定父级是这样声明的:
class Parent {
public:
Parent(int v);
};
ChildOnE
和ChildTwo
都继承Parent
。是否存在以下快捷方式:
shared_ptr<Parent> myObject;
switch(input) {
case 1: {
myObject = make_shared<ChildOne>(int v);
break;
}
case 2: {
myObject = make_shared<ChildTwo>(int v);
break;
}
}
在处理两个以上的子对象时,这尤其繁重,尤其是在构造函数以相同方式构造时。我们不能以某种方式复制纯虚拟构造函数的行为,以便所有子对象都必须实现它,然后只更改所调用的类,而不更改参数吗?
TL; DR 如何缩短上述示例?
答案 0 :(得分:1)
您可以创建一个查找表;像这样:
using Ctor = shared_ptr<Parent>(int v);
static const std::map<int, Ctor *> ctors = {
{1, (Ctor *)make_shared<ChildOne>}, // The cast chooses overload;
{2, (Ctor *)make_shared<ChildTwo>}, // not sure is that necessary in such context
};
...
return (ctors.at(input))(v);
这里的妙处在于,尽管构造函数是特殊的,并且不能采用其地址,但是make_shared
是可以自由传递的常规函数指针。