Jusqu'à présent, tous les proféré des exemples de modèle par défaut des paramètres pour les modèles de fonction peut être fait avec les surcharges.
AraK:
struct S {
template <class R = int> R get_me_R() { return R(); }
};
pourrait être:
struct S {
template <class R> R get_me_R() { return R(); }
int get_me_R() { return int(); }
};
Mon propre:
template <int N = 1> int &increment(int &i) { i += N; return i; }
pourrait être:
template <int N> int &increment(int &i) { i += N; return i; }
int &increment(int &i) { return increment<1>(i); }
litb:
template<typename Iterator, typename Comp = std::less<Iterator> >
void sort(Iterator beg, Iterator end, Comp c = Comp())
pourrait être:
template<typename Iterator>
void sort(Iterator beg, Iterator end, std::less<Iterator> c = std::less<Iterator>())
template<typename Iterator, typename Comp >
void sort(Iterator beg, Iterator end, Comp c = Comp())
Stroustrup:
template <class T, class U = double>
void f(T t = 0, U u = 0);
Pourrait être:
template <typename S, typename T> void f(S s = 0, T t = 0);
template <typename S> void f(S s = 0, double t = 0);
Qui j'ai prouvé avec le code suivant:
#include <iostream>
#include <string>
#include <sstream>
#include <ctype.h>
template <typename T> T prettify(T t) { return t; }
std::string prettify(char c) {
std::stringstream ss;
if (isprint((unsigned char)c)) {
ss << "'" << c << "'";
} else {
ss << (int)c;
}
return ss.str();
}
template <typename S, typename T> void g(S s, T t){
std::cout << "f<" << typeid(S).name() << "," << typeid(T).name()
<< ">(" << s << "," << prettify(t) << ")\n";
}
template <typename S, typename T> void f(S s = 0, T t = 0){
g<S,T>(s,t);
}
template <typename S> void f(S s = 0, double t = 0) {
g<S,double>(s, t);
}
int main() {
f(1, 'c'); // f<int,char>(1,'c')
f(1); // f<int,double>(1,0)
// f(); // error: T cannot be deduced
f<int>(); // f<int,double>(0,0)
f<int,char>(); // f<int,char>(0,0)
}
La sortie imprimée correspond à des observations pour chaque appel à f, et le commentée d'échec de l'appel à compiler comme prévu.
Donc je pense que par défaut les paramètres de modèle "ne sont pas nécessaires", mais probablement seulement dans le même sens que la valeur par défaut des arguments de la fonction "ne sont pas nécessaires". Comme de Stroustrup rapport de défaut indique, l'ajout de la non-déduire des paramètres était trop tard pour quiconque de réaliser et/ou apprécie vraiment qu'il fait par défaut utiles. Donc, la situation actuelle est en effet basée sur une version de modèles de fonction qui n'a jamais été la norme.