अब तक, सब के proffered उदाहरण फ़ंक्शन टेम्पलेट्स के लिए डिफ़ॉल्ट टेम्पलेट पैरामीटर ओवरलोड के साथ किया जा सकता है।
अरक:
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)
}
मुद्रित आउटपुट प्रत्येक कॉल के लिए टिप्पणियों से मेल खाता है, और टिप्पणी-आउट कॉल अपेक्षित रूप से संकलित करने में विफल रहता है।
तो मुझे संदेह है कि डिफ़ॉल्ट टेम्पलेट पैरामीटर "की आवश्यकता नहीं है", लेकिन शायद केवल उसी अर्थ में कि डिफ़ॉल्ट फ़ंक्शन तर्क "आवश्यक नहीं हैं"। चूंकि स्ट्राउस्ट्रप की दोष रिपोर्ट इंगित करती है, गैर-कटौती वाले पैरामीटर को जोड़ने के लिए किसी को भी एहसास हुआ और/या वास्तव में सराहना की गई कि यह डिफ़ॉल्ट रूप से उपयोगी है। तो वर्तमान स्थिति प्रभावी रूप से फ़ंक्शन टेम्पलेट्स के संस्करण के आधार पर प्रभावी है जो कभी मानक नहीं थी।
लें कि आप निम्न समारोह करना चाहते हैं देता है:
+1 यह वास्तव में एक मुश्किल सवाल है। – AraK
पहले तीन पोस्ट किए गए उत्तरों के लिए, इस उदाहरण पर विचार करें: 'संरचना एस {टेम्पलेट <कक्षा आर = int> आर get_me_R() {\t वापसी आर(); }}; 'टेम्पलेट पैरामीटर को संदर्भ से नहीं लिया जा सकता है। – AraK
अच्छा सवाल। 3 लोगों ने पहले ही यह कहने का उत्तर दिया है कि "यह समझ में नहीं आता", और वे सभी सामान्य रूप से गलत हैं। फंक्शन टेम्पलेट पैरामीटर * कॉल * पैरामीटर कॉल पैरामीटर से हमेशा कटौती योग्य नहीं होते हैं। उदाहरण के लिए, अगर उन्हें अनुमति दी गई तो मैं 'टेम्पलेट int और increment (int & i) {i + = N; वापसी मैं; } ', और फिर 'वृद्धि (i);' या 'वृद्धि <2> (i);'। जैसा कि है, मुझे 'वृद्धि <1> (i); 'लिखना है। –