在不知道模板类型的情况下,无法直接将一个对象转换为模板子类。模板子类的类型是根据模板参数确定的,而无法通过运行时的对象来确定。
一个解决方法是使用模板函数,该函数接受一个基类对象,并返回一个模板子类对象。在函数中,可以根据需要的模板类型使用特化的实现来创建子类对象。
下面是一个示例代码:
#include 
// 基类
class BaseClass {
public:
    virtual void print() {
        std::cout << "BaseClass" << std::endl;
    }
};
// 模板子类
template 
class SubClass : public BaseClass {
public:
    void print() override {
        std::cout << "SubClass<" << typeid(T).name() << ">" << std::endl;
    }
};
// 模板函数,将基类对象转换为模板子类对象
template 
SubClass* convertToSubClass(BaseClass* base) {
    return new SubClass();
}
int main() {
    BaseClass* base = new BaseClass();
    base->print();
    SubClass* sub = convertToSubClass(base);
    sub->print();
    delete base;
    delete sub;
    return 0;
}
       在上述代码中,我们定义了一个基类 BaseClass 和一个模板子类 SubClass。然后,我们编写了一个模板函数 convertToSubClass,该函数接受一个 BaseClass 对象,并返回一个根据模板参数 T 特化的 SubClass 对象。
在 main 函数中,我们创建了一个基类对象 base 并打印其类型。然后,我们通过调用 convertToSubClass 将 base 转换为 SubClass 对象,并打印其类型。
输出结果为:
BaseClass
SubClass
 需要注意的是,由于模板是在编译时实例化的,因此在运行时无法动态确定模板类型。因此,在使用模板时,需要在编译时指定模板类型。