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

vd2z7a6w  于 2023-02-01  发布在  其他
关注(0)|答案(2)|浏览(178)

有没有可能从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级联或虚拟函数的解决方案。

l5tcr1uw

l5tcr1uw1#

编译器为每种类型独立于其他类型生成std::type_info。每个类没有唯一的编译时枚举/整数。
您可能需要向层次结构中添加另一个虚函数,这样就完全不需要使用switch语句,或者使用visitor pattern
或者,尝试Open and Efficient Type Switch for C++

4uqofj5v

4uqofj5v2#

这是一个小技巧,如何创建关于类型的静态信息,以便您可以在C++11中使用一个开关静态或动态地快速比较它们。

#include <iostream>
#include <vector>

struct Base {
    int m_ClassID;
    Base(int _id) : m_ClassID(_id) {} // dynamic classID
};

template<int N>
struct Base_ : Base {
    static constexpr int g_ClassID = N; // static classID
    Base_() : Base(N) {}
};

struct A : Base_<2222> // define ClassID
{};

struct B  : Base_<3333> // define ClassID
{};

void DoForAnyBase(Base* pBase) {
    switch(pBase->m_ClassID) {
        case A::g_ClassID:
        printf("I'm A");
        break;
        case B::g_ClassID:
        printf("I'm B");
        break;
    }
}

int main() {
    std::vector< Base* > aTypes;
    aTypes.push_back( new A() );
    aTypes.push_back( new B() );

    for( Base* pCur : aTypes) {
        DoForAnyBase(pCur);
        delete pCur;
    }
}

相关问题