有没有可能从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级联或虚拟函数的解决方案。
2条答案
按热度按时间l5tcr1uw1#
编译器为每种类型独立于其他类型生成
std::type_info
。每个类没有唯一的编译时枚举/整数。您可能需要向层次结构中添加另一个虚函数,这样就完全不需要使用switch语句,或者使用visitor pattern。
或者,尝试Open and Efficient Type Switch for C++。
4uqofj5v2#
这是一个小技巧,如何创建关于类型的静态信息,以便您可以在C++11中使用一个开关静态或动态地快速比较它们。