2010-12-14 5 views
0

Tenir compte de ces fonctions surchargées,Modèle C++: Sélection de fonctions surchargées en utilisant la conversion implicite en type instancié par template!

void fun(Int2Type<1>) {} 
void fun(Int2Type<2>) {} 
void fun(Int2Type<3>) {} 
void fun(Int2Type<4>) {} 

Je veux appeler ces de cette façon,

fun(1); // this should call first function 
fun(4); // this should call fourth function 

Est-il possible de le faire? Si oui, alors pouvons-nous faire la même chose avec une valeur d'exécution, dire, (s'il vous plaît noter que dans les appels ci-dessus, l'argument est connu à la compilation)

fun(value); // value can be decided at runtime! 

Ou tout alternative si ce n'est pas possible? Le but est, la fonction différente devrait être appelée basée sur la valeur intégrale différente!


EDIT

Soit dit en passant, je ne peux pas utiliser une des opérations suivantes:

  1. En utilisant switch(value)
  2. utilisant certains SomeFuncTable funTable[] = {fun(Int2Type<1>(), fun(Int2Type<2>()} etc
+0

Je doute sincèrement que ce soit possible, mais j'aimerais connaître la réponse si elle existe effectivement. – acron

+2

Pourquoi pas? – Puppy

+0

Vous n'avez pas mentionné que Int2Type vient de Loki. –

Répondre

2

Vous pouvez le faire un peu différemment:

template<int N> void func(); 
template<> void func<1>(){/*the body*/} 
template<> void func<2>(){/*the body*/} 

Et vous pouvez appeler: func<1>().

Ou vous pouvez appeler le code original de cette façon: func(Int2Type<1>()).

De toute façon tout cela ne fonctionne qu'avec des constantes de temps de compilation.

+0

Je pense que c'est bon d'expérimenter. Laisse-moi rentrer à la maison, j'ai besoin de jouer avec tout ça. Merci pour le post. :-) – Nawaz

+0

En fait, le but de [Int2Type] (http://loki-lib.sourceforge.net/html/a00683.html) est de créer un ** type ** distinct d'un ** int ** afin de envoyer un appel à différentes surcharges. –

2

Non, il n'y a aucun moyen utiliser les valeurs d'exécution en tant que paramètre de modèle. La seule chose que vous pouvez faire est quelque chose comme:

void fun(int x) { 
    switch(x) { 
    case 1: 
     fun(Int2Type<1>()); 
     break; 
    case 2: 
     fun(Int2Type<2>()); 
     break; 
    case 3: 
     fun(Int2Type<3>()); 
     break; 
    case 4: 
     fun(Int2Type<4>()); 
     break; 
    } 
} 
2

Il n'y a aucun moyen d'accomplir ce que vous voulez, car ils ont tous faire bouillir jusqu'à la même chose- une table de saut, ou une grande série de if/else. C'est tout. Toute autre caractéristique va devenir juste cela. Fais juste une table de saut. Vous pouvez utiliser un tableau de pointeurs de fonction (le plus rapide) ou quelque chose de plus flexible comme un unordered_map<int, std::function<void()>>. Oh, sauf si vous voulez écrire votre propre compilateur JIT et JIT le nouveau code d'assemblage quand vous en avez besoin. Tu pourrais le faire. Mais je ne vois pas vraiment le point, car vous avez toujours le même problème - comment choisir le chemin du code à prendre, qui va devenir une table de saut ou une chaîne if/else.

Questions connexes