Cho đến nay, tất cả các ví dụ chìa của các tham số mẫu mặc định cho các mẫu chức năng có thể được thực hiện với 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(); }
};
My own:
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);
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 in khớp với 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 "là không cần thiết", nhưng có lẽ chỉ trong cùng một nghĩa là các đối số mặc định của hàm "không cần thiết". Theo báo cáo lỗi của Stroustrup, việc bổ sung các tham số không được suy luận đã quá muộn để mọi người có thể nhận ra và/hoặc thực sự đánh giá cao rằng nó đã làm cho các giá trị mặc định có ích. Vì vậy, tình hình hiện tại là 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 mà không bao giờ là tiêu chuẩn.
+1 Đó thực sự là một câu hỏi phức tạp. – AraK
Đối với ba câu trả lời đầu tiên được đăng, hãy xem xét ví dụ này: 'struct S {template R get_me_R() {\t return R(); }}; 'Tham số mẫu không thể được suy ra từ ngữ cảnh. –
AraK
Câu hỏi hay. 3 người đã trả lời để nói rằng "không có ý nghĩa", và tất cả đều sai lầm nói chung. Các tham số mẫu chức năng là * không * luôn được khấu trừ từ các tham số gọi hàm. Ví dụ, nếu chúng được cho phép tôi có thể viết 'mẫu int & increment (int & i) {i + = N; trả lại i; } ', và sau đó' increment (i); 'hoặc' increment <2> (i); '. Vì nó là, tôi phải viết 'increment <1> (i);'. –