จนถึงตอนนี้ตัวอย่างที่เสนอทั้งหมดของพารามิเตอร์แม่แบบเริ่มต้นสำหรับแม่แบบฟังก์ชั่นสามารถทำได้ด้วยการโอเวอร์โหลด
อารักษ์:
struct S {
template <class R = int> R get_me_R() { return R(); }
};
อาจจะเป็น:
struct S {
template <class R> R get_me_R() { return R(); }
int get_me_R() { return int(); }
};
ของฉันเอง:
template <int N = 1> int &increment(int &i) { i += N; return i; }
อาจจะเป็น:
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())
อาจจะเป็น:
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);
อาจจะเป็น:
template <typename S, typename T> void f(S s = 0, T t = 0);
template <typename S> void f(S s = 0, double t = 0);
ซึ่งฉันพิสูจน์ด้วยรหัสต่อไปนี้:
#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)
}
เอาต์พุตที่พิมพ์ออกมาตรงกับความคิดเห็นสำหรับการโทรแต่ละครั้งถึง f และการคอมเม้นต์การโทรออกไม่สามารถคอมไพล์ได้ตามที่คาดไว้
ดังนั้นฉันจึงสงสัยว่าพารามิเตอร์เทมเพลตเริ่มต้น "ไม่จำเป็น" แต่อาจในแง่เดียวกับที่อาร์กิวเมนต์ของฟังก์ชันเริ่มต้น "ไม่จำเป็น" ดังที่รายงานข้อบกพร่องของ Stroustrup บ่งชี้ว่าการเพิ่มพารามิเตอร์ที่ไม่ได้เกิดจากการอนุมานนั้นสายเกินไปสำหรับทุกคนที่จะรับรู้และ / หรือขอบคุณจริง ๆ ที่ทำให้ค่าเริ่มต้นมีประโยชน์ ดังนั้นสถานการณ์ปัจจุบันจึงมีผลตามเวอร์ชันของแม่แบบฟังก์ชั่นที่ไม่เคยเป็นมาตรฐาน