将C ++ RTTI作为枚举在switch语句中进行分派

时间:2018-07-23 09:50:39

标签: c++ rtti

是否可以从C ++ rtti type_info获取编译时枚举id?我想在switch语句中使用它,以便首先通过散列在类型上进行分派。有一些标准的方法吗?用伪代码类似:

#include <iostream>
#include <typeinfo>
#include <typeindex>
using namespace std;

struct base { virtual void f(void) = 0; };
struct a : public base { int v; void f(void) {}; };
struct b : public base { int v; void f(void) {}; };

void f(base *v) {

    switch(typeid(*v).hash_code()) {
        case comiletime_hash(typeid(a)):
            cout << "Is a\n";
        break;
        case comiletime_hash(typeid(b)):
            cout << "Is b\n";
        break;
    }
}

int main(int argc, char **argv) {

    a v0;
    b v1;
    f(&v0);
    f(&v1);

    return 0;
}

但是hash_code仅在运行时可用。

我想找出天气,我可以使用Rtti从c:重写一些代码:

  enum { typ1, typ2 ...}
  struct { int Tag; union { struct t1; struct t2;...}}
   ...
   switch (v->Tag) {
   case typ1: .... do something t1
   case typ2: ... do something t2
   ... }

我想保留switch语句。我不是在寻找使用dynamic_cast if-elseif级联或虚拟函数的解决方案。

1 个答案:

答案 0 :(得分:1)

编译器会为每种类型生成std::type_info,而与其他类型无关。每个类没有唯一的编译时枚举/整数。

您可能需要在层次结构中添加另一个虚拟函数,从而根本不需要使用该switch语句。或使用visitor pattern

或者,尝试Open and Efficient Type Switch for C++