我有一个Child类型的对象,它已经用未知的T进行了初始化。我需要创建一个与此对象相同类型T的新对象。我的Child类型的对象有一个untemplated基类Parent。我对Child类型对象的唯一访问是通过类型为Parent的指针。是否可以将此指针强制转换为指向正确模板化类型Child对象的指针?或者从指向Parent?
的指针获得T.我可以找到的唯一例子在施法时已经知道T.
struct Parent{
};
template <typename T>
struct Child{
typedef T ValueType;
};
template <typename T>
void foo(Parent*) { }
// implementation
Parent* object; // provided from somewhere else, points to Child<T> of unknown T
foo<T>(object); // PROBLEM because T depends on what T the Child in object was templated with
答案 0 :(得分:1)
你的意思是这样的(最小例子)吗?
struct Parent {
virtual Parent * clone() = 0;
};
template<class T>
struct Child: Parent {
Child<T> * clone() override {
return new Child<T>;
}
};
int main() {
Child<int> *c = new Child<int>;
Child<int> *cclone = c->clone();
Parent *pclone = c->clone();
}
修改强>
考虑到OP通过编辑添加的片段,这里是一个稍微修改过的示例(基于相同的想法):
struct Parent;
template <typename T>
void foo(Parent*) { }
struct Parent{
virtual void invokeFoo() = 0;
};
template <typename T>
struct Child: Parent {
void invokeFoo() override {
foo<T>(this);
}
};
int main() {
Parent* object = new Child<int>;
object->invokeFoo();
}