考虑以下:
struct B { };
template<typename T>
struct D : B
{
T t;
}
void g(int i) { ... }
void g(string s) { ... }
void g(char c) { ... }
void f(B* b)
{
if (dynamic_cast<D<int>*>(b))
{
g(dynamic_cast<D<int>*>(b)->t);
}
else if (dynamic_cast<D<string>*>(b))
{
g(dynamic_cast<D<string>*>(b)->t);
}
else if (dynamic_cast<D<char>*>(b))
{
g(dynamic_cast<D<char>*>(c)->t)
}
else
throw error;
};
这里只有三种可能的 T 类型——int、string、char——但如果可能的类型列表更长,比如 n,if else 链将花费 O(n) 来执行。
解决这个问题的一种方法是以某种方式在 D 中存储一个额外的类型代码,然后switch
在类型代码上存储一个额外的类型代码。
RTTI 系统必须已经有这样的代码。有什么办法可以访问它并打开它吗?
还是有更好的方法来做我想做的事情?