Pourquoi les arguments de modèle par défaut sont-ils autorisés uniquement sur les modèles de classe? Pourquoi ne pouvons-nous pas définir un type par défaut dans un modèle de fonction membre? Par exemple:
struct mycclass {
template<class T=int>
void mymember(T* vec) {
// ...
}
};
Au lieu de cela, C ++ force que les arguments de modèle par défaut ne soient autorisés que sur un modèle de classe.
struct S { template <class R = int> R get_me_R() { return R(); } };
Le paramètre de modèle ne peut pas être déduit du contexte.template <int N = 1> int &increment(int &i) { i += N; return i; }
, puisincrement(i);
ouincrement<2>(i);
. En l'état, je dois écrireincrement<1>(i);
.Réponses:
Il est logique de donner des arguments de modèle par défaut. Par exemple, vous pouvez créer une fonction de tri:
C ++ 0x les introduit au C ++. Voir ce rapport de défaut par Bjarne Stroustrup: Arguments de modèle par défaut pour les modèles de fonction et ce qu'il dit
la source
double
dans mon cas). Ce n'est peut-être pas «général», mais y a-t-il un inconvénient à cette pratique? Merci.error: invalid conversion from ‘int’ to ‘int*’
, toute idée pourquoi: `#include <array> #include <algorithm> #include <functional> template <typename Iterator, typename Comp = std :: less <Iterator>> void my_sort ( Iterator beg, Iterator end, Comp c = Comp ()) {std :: sort (begin, end, c); } int main () {std :: array <int, 5> ar {5,2,21,7,4}; mon_sort (ar.begin (), ar.end ()); } `Pour citer des modèles C ++: Le guide complet (page 207):
la source
Jusqu'à présent, tous les exemples proposés de paramètres de modèle par défaut pour les modèles de fonction peuvent être réalisés avec des surcharges.
AraK:
pourrait être:
Le mien:
pourrait être:
litb:
pourrait être:
Stroustrup:
Pourrait être:
Ce que j'ai prouvé avec le code suivant:
La sortie imprimée correspond aux commentaires pour chaque appel à f, et l'appel commenté ne parvient pas à se compiler comme prévu.
Je soupçonne donc que les paramètres de modèle par défaut "ne sont pas nécessaires", mais probablement seulement dans le même sens que les arguments de fonction par défaut "ne sont pas nécessaires". Comme l'indique le rapport de défaut de Stroustrup, l'ajout de paramètres non déduits était trop tard pour que quiconque se rende compte et / ou apprécie vraiment qu'il rendait les valeurs par défaut utiles. La situation actuelle est donc en fait basée sur une version de modèles de fonctions qui n'a jamais été standard.
la source
template<typename T = void> int SomeFunction();
. Le paramètre template ici n'est jamais utilisé, et en fait la fonction n'est jamais appelée; le seul endroit auquel il est fait référence est dans undecltype
ousizeof
. Le nom correspond délibérément au nom d'une autre fonction, mais le fait qu'il s'agisse d'un modèle signifie que le compilateur préférera la fonction gratuite si elle existe. Les deux sont utilisés dans SFINAE pour fournir un comportement par défaut lorsqu'une définition de fonction est manquante.Sous Windows, avec toutes les versions de Visual Studio, vous pouvez convertir cette erreur ( C4519 ) en avertissement ou la désactiver comme suit :
Voir plus de détails ici .
la source
Ce que j'utilise est la prochaine astuce:
Disons que vous voulez avoir une fonction comme celle-ci:
Vous ne serez pas autorisé, mais je le fais de la manière suivante:
Donc, de cette façon, vous pouvez l'utiliser comme ceci:
Comme nous pouvons le voir, il n'est pas nécessaire de définir explicitement le deuxième paramètre. Peut-être que ce sera utile pour quelqu'un.
la source