我有一些我正在处理的模板场景。这是它的设置。
class Base {
}
class Derived : Base {
};
我的用例:
void DoAThing(Base* t) {
DoAnotherThing(*t);
}
template<typename T>
void DoAnotherThing(T& t) {
}
所以我希望的是我可以将Derived类型传递给我的“DoAThing”,然后当我将其传递给DoAnotherThing时,模板参数将显示为Derived。我可以看到dereferenced类型肯定是由typeid解析为Derived,但是T类型的DoAnotherThing总是以Base形式出现。有没有办法可以操作它,以便DoAnotherThing解析为我发送的派生类型?
编辑:感谢目前为止的答案,但我的用例还没有完全解决。 DoAnotherThing实际上是创建Derived类的容器,问题是容器类型最终是Container而不是Container。我希望DoAThing继续使用Base而不是作为调用它的场景的模板。
答案 0 :(得分:1)
根据你的例子,你应该进行上部强制转换,如果你想从带有指向基类的指针的DoAThing方法调用带有指向派生类的指针的DoAnotherThing函数。要实现此目的,您可以使用2个选项:
1)使用RTTI并获得实际类型,但它需要运行时
2)使用此方法http://arturx64.github.io/programming-world/2015/02/05/lazy-visitor.html进行没有RTTI的上部投射。