解决!
我想使用模板创建一个不同类型对象的数组。 因此,我有一个非模板类(Base)和一个来自Base类的派生模板类。
我想知道的是如何访问派生类'通用值(T val)?
class Base{
public:
// a function returns T val, it will be implemented in Derived class
// EDIT : virtual function here
};
template<class T>
class Derived: public Base {
public:
T val;
Derived(T x) {
val = x;
}
// implementation.. it returns val
// EDIT : Implementation of virtual function
};
解决方案: dynamic_cast,请注意,基类应该至少有一个虚函数。
Base *p[2];
p[0] = new Derived<int>(24);
p[1] = new Derived<double>(82.56);
int a = dynamic_cast<Derived<int>*>(p[0])->val; // casts p[0] to Derived<int>*
double b = dynamic_cast<Derived<double>*>(p[1])->val; // casts p[1] to Derived<double>*
cout << a << endl;
cout << b << endl;
答案 0 :(得分:0)
上次我检查过,你不能从基类(非虚拟)中获取派生类成员。
您可以使用模板修改代码。在构造时,类型和值将传递给基类,然后您可以使用它。
template<typename T>
class Base {
T ini;
public:
Base(T arg){ini = arg;}
T ret(){return ini;}
};
template<class T>
class Derived: public Base<T> {
public:
T val;
Derived(T x) : Base<T>(x) {
//Base(x);
val = x;
}
// implementation.. it returns val
};
然后您可以照常实例化并使用它。
Derived<int> e(5);
e.ret();
答案 1 :(得分:0)
看起来你想要CRTP
这个想法是访问基类中的派生类成员。请注意,您无法包含异构列表。
template<typename D>
struct Base {
void doThings() {
// access the derived class getT function
auto var = static_cast<D&>(*this).getT();
cout << var << endl;
}
};
template<typename T>
struct Derived : Base<Derived> {
T getT() {
return myT;
}
private:
T myT;
};