次の点を考慮してください。
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 の 3 つしかありませんが、可能な型のリストがより長い場合、たとえば n の場合、if else チェーンの実行には O(n) が必要になります。
これに対処する 1 つの方法は、追加の型コードを何らかの方法で D に格納し、次に型コードに格納することswitch
です。
RTTI システムには、そのようなコードがすでに存在している必要があります。それにアクセスしてスイッチを入れる方法はありますか?
または、私がやろうとしていることを行うためのより良い方法はありますか?