Şimdiye kadar, işlev şablonları için varsayılan şablon parametrelerinin tüm istenen örnekleri aşırı yüklerle yapılabilir.
arak:
struct S {
template <class R = int> R get_me_R() { return R(); }
};
olabilirdi:
struct S {
template <class R> R get_me_R() { return R(); }
int get_me_R() { return int(); }
};
Benim:
template <int N = 1> int &increment(int &i) { i += N; return i; }
olabilirdi:
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())
olabilirdi:
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);
Olabilirdi:
template <typename S, typename T> void f(S s = 0, T t = 0);
template <typename S> void f(S s = 0, double t = 0);
Hangi aşağıdaki kod ile kanıtladı:
#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)
}
Yazdırılan çıktı, f'ye yapılan her çağrı için yorumları eşleştirir ve yorum yapılan çağrı beklendiği gibi derlenemez.
Bu nedenle, varsayılan şablon parametrelerinin "gerekli olmadığından", ancak muhtemelen yalnızca varsayılan işlev bağımsız değişkenlerinin "gerekli olmadığından" aynı olduğundan şüpheleniyorum. Stroustrup'un hata raporunun da belirttiği gibi, çıkarılmamış parametrelerin eklenmesi, herkesin varsayılanları yararlı hale getirdiğini fark etmesi ve / veya gerçekten takdir etmesi için çok geç oldu. Dolayısıyla mevcut durum, hiçbir zaman standart olmayan fonksiyon şablonlarının bir versiyonuna dayanmaktadır.