Runtime typeswitch pour TypeListes comme un commutateur au lieu d'un imbriqué si ce?
-
23-09-2019 - |
Question
est de TTL:
////////////////////////////////////////////////////////////
// run-time type switch
template <typename L, int N = 0, bool Stop=(N==length<L>::value) > struct type_switch;
template <typename L, int N, bool Stop>
struct type_switch
{
template< typename F >
void operator()( size_t i, F& f )
{
if( i == N )
{
f.operator()<typename impl::get<L,N>::type>();
}
else
{
type_switch<L, N+1> next;
next(i, f);
}
}
};
Il est utilisé pour typeswitching sur une TypeListe. La question est - ils font cela par une série de imbriquée si son. Est-il possible de faire ce commutateur de type comme une seule instruction select au lieu?
Merci!
La solution
Vous aurez besoin du préprocesseur pour générer un grand switch
. Vous aurez besoin get<>
de no-op hors lookups lié. Vérifiez la sortie du compilateur pour être sûr que les cas non utilisés ne produisent pas de sortie, si vous vous souciez; ajuster, si nécessaire;. v)
Consultez la Boost préprocesseur Library si vous tenez à obtenir de bons à ce genre de chose ...
template <typename L>
struct type_switch
{
template< typename F >
void operator()( size_t i, F& f )
{
switch ( i ) {
#define CASE_N( N ) \
case (N): return f.operator()<typename impl::get<L,N>::type>();
CASE_N(0)
CASE_N(1)
CASE_N(2)
CASE_N(3) // ad nauseam.
}
};
Autres conseils
Je ne pense pas.
Ce genre de métaprogrammation modèle est normalement fait avec récursivité. Comme il arrive tout à la compilation, je ne serais pas surpris s'il n'y a pas récursion d'exécution ou état-chèques.
Vous pouvez toujours utiliser une recherche binaire au lieu d'une recherche linéaire. Il serait plus compliqué et plus susceptibles d'avoir des bugs dans ce (recherche binaire est étonnamment facile à gâcher).
Vous pouvez également étendre manuellement N type_switch::operator()
, où N est une limite supérieure raisonnable sur le nombre de typelist que vous aurez des longueurs dans votre programme.