在静态函数c ++中获取类的类型

时间:2016-06-19 09:20:50

标签: c++ oop inheritance static-members

我有这段代码:

struct Type{
  const char* name;
  // other stuff
};

template <class T>
class Base{
 public:
    // some other functions
    static const Type *Get_Type(){
       /* Get the STATIC type of the class and make a new Type object */
    virtual const Type *My_Type();
};

编辑:

我想实现两个成员函数,Get_Type()和My_Type()。 每个派生类都继承自Base&lt; T&GT;继承像这个Base&lt;派生&gt;。

我无法访问任何Derived类,也无法更改Get_Type()和My_Type()的声明,但是其他所有内容都是允许的。

Get_Type() - 应该被实现为返回调用它的类的类型。

应该实现

My_Type - 返回调用对象的动态类类型。

例如:

class Derived1: public Base<Derived1> {
 public:
    Derived1() {}
};

class Derived2 : public Derived1 , public Base<Derived2> {
 public:
    Derived2() {}
};

int main() {
    Derived1* b= new Derived2();
    Derived2::Get_Type(); // should return a struct Type with name=Derived2
    b->My_Type(); // should return a struct Type with name=Derived2
    return 0;
}

我的问题是:

1)如何在静态函数Get_Type的主体内部知道调用类的类型?

2)如何在My_Type()体内获得对象的动态类型(this)?

2 个答案:

答案 0 :(得分:1)

C ++中没有虚拟静态。你能得到的最接近的是:

  • 使其成为虚拟成员函数
  • 拥有一个继承自Base
  • 的中间BaseGetTypeImpl模板类
  • 让BaseGetTypeImpl使用T的类型
  • 实现Get_Type()
  • 声明派生时,继承自BaseGetTypeImpl

这称为CRTP。

另一种选择 - 因为你只需要类型 - 将是一个特征模板类,它被声明为之外的基础(即全局)。

答案 1 :(得分:0)

答案是从模板参数中获取类型。 Get_Type()的完整定义是:

template<class T>
const Type *Base<T>::Get_Type() {/* get T's name and construct a Type struct */}

从T你可以得到调用类的类型。

对于My_Type(),定义为:

virtual const Type *My_Type(){
   return this->Get_Type();
}

由于c ++使用动态绑定,因此被调用的成员函数将是调用对象的动态类之一。