是否可以从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级联或虚拟函数的解决方案。
答案 0 :(得分:1)
编译器会为每种类型生成std::type_info
,而与其他类型无关。每个类没有唯一的编译时枚举/整数。
您可能需要在层次结构中添加另一个虚拟函数,从而根本不需要使用该switch语句。或使用visitor pattern。