अब तक, फ़ंक्शन टेम्प्लेट के लिए डिफ़ॉल्ट टेम्प्लेट मापदंडों के सभी प्रोफार्मा उदाहरण ओवरलोड के साथ किए जा सकते हैं।
अरक:
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 से मेल खाता है, और टिप्पणी-आउट कॉल अपेक्षा के अनुरूप संकलन करने में विफल रहता है।
इसलिए मुझे संदेह है कि डिफ़ॉल्ट टेम्पलेट पैरामीटर "आवश्यक नहीं हैं", लेकिन संभवतः केवल उसी अर्थ में कि डिफ़ॉल्ट फ़ंक्शन तर्क "आवश्यक नहीं हैं"। जैसा कि स्ट्रॉस्ट्रुप की दोष रिपोर्ट इंगित करती है, गैर-कटौती किए गए मापदंडों का जोड़ किसी को भी महसूस करने के लिए बहुत देर हो चुकी थी और / या वास्तव में सराहना करती है कि इसने चूक को उपयोगी बना दिया। तो वर्तमान स्थिति फंक्शन टेम्प्लेट के एक संस्करण पर आधारित है जो कभी मानक नहीं था।