Cho đến nay, tất cả các ví dụ phổ biến về các tham số mẫu mặc định cho các mẫu hàm có thể được thực hiện với tình trạng quá tải.
AraK:
struct S {
template <class R = int> R get_me_R() { return R(); }
};
có thể là:
struct S {
template <class R> R get_me_R() { return R(); }
int get_me_R() { return int(); }
};
Của riêng tôi:
template <int N = 1> int &increment(int &i) { i += N; return i; }
có thể là:
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())
có thể là:
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);
Có thể là:
template <typename S, typename T> void f(S s = 0, T t = 0);
template <typename S> void f(S s = 0, double t = 0);
Mà tôi đã chứng minh với đoạn mã sau:
#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)
}
Đầu ra được in khớp với các nhận xét cho mỗi cuộc gọi đến f và cuộc gọi nhận xét không thể biên dịch như mong đợi.
Vì vậy, tôi nghi ngờ rằng các tham số mẫu mặc định "không cần thiết", nhưng có lẽ chỉ theo nghĩa tương tự rằng các đối số chức năng mặc định "không cần thiết". Như báo cáo lỗi của Stroustrup chỉ ra, việc bổ sung các tham số không suy diễn là quá muộn để bất kỳ ai nhận ra và / hoặc thực sự đánh giá cao rằng nó làm cho mặc định trở nên hữu ích. Vì vậy, tình hình hiện tại có hiệu lực dựa trên một phiên bản của các mẫu chức năng không bao giờ là tiêu chuẩn.