Finora, tutti gli esempi offerti di parametri di modello predefiniti per i modelli di funzione possono essere eseguiti con sovraccarichi.
ARAK:
struct S {
template <class R = int> R get_me_R() { return R(); }
};
potrebbe essere:
struct S {
template <class R> R get_me_R() { return R(); }
int get_me_R() { return int(); }
};
Il mio:
template <int N = 1> int &increment(int &i) { i += N; return i; }
potrebbe essere:
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())
potrebbe essere:
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);
Potrebbe essere:
template <typename S, typename T> void f(S s = 0, T t = 0);
template <typename S> void f(S s = 0, double t = 0);
Che ho dimostrato con il seguente codice:
#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)
}
L'output stampato corrisponde ai commenti di ciascuna chiamata a f e la chiamata commentata non viene compilata come previsto.
Quindi sospetto che i parametri del modello predefinito "non siano necessari", ma probabilmente solo nello stesso senso in cui gli argomenti della funzione predefinita "non sono necessari". Come indica il rapporto sui difetti di Stroustrup, l'aggiunta di parametri non dedotti era troppo tardi perché qualcuno potesse rendersi conto e / o apprezzare davvero che rendeva utili le impostazioni predefinite. Quindi la situazione attuale è in effetti basata su una versione di modelli di funzioni che non è mai stata standard.