使用未知T从Parent *转换为Child <t> *,并获得T.

时间:2016-06-15 16:42:56

标签: c++ templates pointers

我有一个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

1 个答案:

答案 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();
}