我最近一直在研究PHP Bencode extension,我在BItem
或vector
中存储了一系列抽象基类(ordered_map
)的指针。在处理字典或Bencode中的列表时。
但是,我需要将指针转换回派生类(BDict
,BList
,BStr
和BInt
),然后再将它们包装并返回给PHP。所以我定义了一个名为getType()
的方法,并根据方法的返回值将基类指针映射到派生类的。
但是我经常使用地图,在我完成初始版本之后,在我的代码中可以找到相同的if-else语句,例如:
if (iter->second->getType() == "BDict") {
BDict *current = new BDict(iter->second);
retval += current->__toString().stringValue();
} else if (iter->second->getType() == "BList") {
BList *current = new BList(iter->second);
retval += current->__toString().stringValue();
} else if (iter->second->getType() == "BStr") {
BStr *current = new BStr(iter->second);
retval += current->__toString().stringValue();
} else if (iter->second->getType() == "BInt") {
BInt *current = new BInt(iter->second);
retval += current->__toString().stringValue();
}
这太糟糕了。老实说,我不是很擅长C ++,但我考虑了很多。使用像template<typename T> T* toChild(BItem *parent)
这样的模板函数转换指针?不,编译器将无法确定返回类型。设置“me指针”并使用特定方法返回它?不,我不能使用具有不同返回类型的函数覆盖基类中的函数。
那么我怎样才能以更优雅的方式实现这个目标呢?