2010-10-07 3 views

Répondre

2

J'irais pour la seconde sauf si foo() est extrêmement critique, car je pense que c'est plus clair.

En ce qui concerne les différences:

Le premier sera compilé dans différentes versions pour différentes valeurs Number. Cela peut permettre au compilateur de faire plus d'optimisations en fonction de l'utilisation de num.

La seconde aura seulement des versions différentes pour différents T, et sélectionnera pour différents num au moment de l'exécution.

La première peut être légèrement plus rapide, mais la seconde génère moins de code (ce qui peut être plus rapide en fonction de la pression de la mémoire).

10

Cela dépend vraiment de ce que vous voulez faire. Si la valeur num est un paramètre de modèle, elle doit être spécifiée lors de la compilation. S'il s'agit d'un paramètre de fonction, il peut être spécifié lors de l'exécution.

Quel est votre cas d'utilisation?

4

Voici un problème de propreté de code que vous voulez connaître. Supposons qu'un utilisateur entre l'option. Vous avez donc une variable Number x qui peut être One ou Two. Si vous voulez appeler foo(), vous devez faire ...

if (x == One) 
    foo<const char *, One>("asd"); 
else 
    foo<const char *, Two>("asd"); 

alors que, si vous avez utilisé la méthode alternative (votre numéro de suggestion deux), vous pouvez simplement faire:

foo<const char *>("asd", x); 

Maintenant, si dans cette fonction, il serait très bénéfique d'avoir ces branches possibles optimisées, alors assurez-vous. Mais sinon, je pense que tu ne fais que rendre la vie difficile pour toi-même.


Aussi, sur la façon dont ces méthodes sont différentes. Dans le code que j'ai écrit ci-dessus, j'ai référencé trois fonctions différentes. Dans le dernier, où il n'y a qu'un seul paramètre de modèle, le code généré pour cette fonction inclura les deux chemins de code, quand num == One et quand num == Two. Les deux premières méthodes basées sur des modèles, cependant, auront été capables d'enlever ces branches. Il peut le faire car il va construire deux chemins de code différents en mémoire, un pour chaque cas.

Questions connexes