gpt4 book ai didi

c++ - 获取 C++ RTTI 作为 switch 语句中调度的枚举

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:05:17 25 4
gpt4 key购买 nike

是否可以从 C++ rtti type_info 获取编译时枚举 ID?我想在 switch 语句中使用它来分派(dispatch)类型而不首先通过哈希。有没有一些标准的方法可以做到这一点?在伪代码中是这样的:

#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 级联或虚函数的解决方案。

最佳答案

编译器为每个类型生成独立于其他类型的 std::type_info。每个类都没有唯一的编译时枚举/整数。

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

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

关于c++ - 获取 C++ RTTI 作为 switch 语句中调度的枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51475941/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com