从非模板类派生的模板类:访问派生类'通用变量

时间:2015-10-31 16:18:40

标签: c++ templates

解决!

我想使用模板创建一个不同类型对象的数组。 因此,我有一个非模板类(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;

2 个答案:

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