Considérez ce qui suit:C++ 11 Cast dynamique If Else Chain -> Commutateur
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;
};
Ici, il y a seulement trois types possibles de T - int, string, char - mais si la liste des types possibles étaient plus long, disons n, la chaîne if else prendrait O (n) pour s'exécuter.
Une façon de traiter cela serait de stocker un code de type supplémentaire dans D en quelque sorte, puis switch
sur le code de type.
Le système RTTI doit déjà avoir un tel code. Y a-t-il un moyen d'y accéder et de l'allumer?
Ou y at-il une meilleure façon de faire ce que j'essaie de faire?
@JoachimPileborg: Dans cet exemple de jouet, je pourrais simplement remplacer 'f' par' struct D {virtual void f() {g (t)}} ', mais cela ne correspond pas au plus gros problème. –