web-dev-qa-db-fra.com

Spécialisation des modèles VS Fonction Surcharge

Un manuel que j'ai note que vous pouvez fournir votre propre implémentation pour les fonctions de bibliothèque standard telles que swap(x,y) via la spécialisation de modèle ou la surcharge de fonction. Cela serait utile pour tout type qui peut bénéficier d'une autre chose qu'un échange d'attribution, comme STL containers Par exemple (qui ont déjà des swaps écrits, je sais).

Mes questions sont les suivantes :

  1. Quoi de mieux: Spécialisation des modèles pour donner votre implémentation spécialisée ou une surcharge de fonction fournissant les paramètres exacts que vous souhaitez utiliser sans modèle?

  2. Pourquoi est-ce mieux? Ou s'ils sont égaux, pourquoi est-ce?

51

Il y a peu à ajouter à la réponse de Peter Alexander. Permettez-moi simplement de mentionner une utilisation dans la spécialisation de la fonction de quelle fonctionnalité pourrait être préférable sur la surcharge: si vous devez sélectionnez-vous entre les fonctions sans paramètres.

Par exemple.

template<class T> T zero();
template<> int zero() { return 0; }
template<> long zero() { return 0L; }

Pour faire quelque chose de similaire à l'aide de la surcharge de fonction, vous devez ajouter un paramètre à la signature de la fonction:

int zero(int) { return 0; }
long zero(long) { return 0L; }
13
Paolo M

Vous n'êtes pas autorisé à surcharger des fonctions dans l'espace de noms std, mais vous êtes autorisé à spécialiser les modèles (comme je me rappelle), c'est donc une option.

L'autre option consiste à mettre votre fonction swap dans la même espace de noms que la chose qu'il fonctionne sur et using std::swap; Avant d'appeler un échange non qualifié.

5
Mark B