Sejauh ini, semua contoh parameter templat default yang disodorkan untuk templat fungsi dapat dilakukan dengan kelebihan beban.
AraK:
struct S {
template <class R = int> R get_me_R() { return R(); }
};
bisa jadi:
struct S {
template <class R> R get_me_R() { return R(); }
int get_me_R() { return int(); }
};
Saya sendiri:
template <int N = 1> int &increment(int &i) { i += N; return i; }
bisa jadi:
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())
bisa jadi:
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);
Bisa jadi:
template <typename S, typename T> void f(S s = 0, T t = 0);
template <typename S> void f(S s = 0, double t = 0);
Yang saya buktikan dengan kode berikut:
#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)
}
Output yang dicetak cocok dengan komentar untuk setiap panggilan ke f, dan panggilan yang dikomentari gagal untuk mengkompilasi seperti yang diharapkan.
Jadi saya menduga bahwa parameter templat default "tidak diperlukan", tetapi mungkin hanya dalam arti yang sama bahwa argumen fungsi default "tidak diperlukan". Seperti yang ditunjukkan oleh laporan cacat Stroustrup, penambahan parameter yang tidak dideduksikan sudah terlambat bagi siapa pun untuk menyadari dan / atau benar-benar menghargai bahwa itu membuat default berguna. Jadi situasi saat ini berlaku berdasarkan versi templat fungsi yang tidak pernah standar.