वैरैडिक टेम्पलेट्स printf फ़ंक्शन के कई कार्यान्वयन हैं।वैराडिक टेम्पलेट्स और टाइपफैटी
void printf(const char* s) {
while (*s) {
if (*s == '%' && *++s != '%')
throw std::runtime_error("invalid format string: missing arguments");
std::cout << *s++;
}
}
template<typename T, typename... Args>
void printf(const char* s, const T& value, const Args&... args) {
while (*s) {
if (*s == '%' && *++s != '%') {
std::cout << value;
return printf(++s, args...);
}
std::cout << *s++;
}
throw std::runtime_error("extra arguments provided to printf");
}
और हर जगह कहा जाता है कि इस कार्यान्वयन टाइप-सुरक्षित जबकि सामान्य सी (variadic तर्क va_arg के साथ) नहीं है कि: एक यह है।
वह क्यों है? टाइप-सुरक्षित होने का क्या अर्थ है और सी printf va_arg पर इस कार्यान्वयन के क्या फायदे हैं?
यह संस्करण प्रारूप झंडे के बारे में बिल्कुल परवाह नहीं करता है, यह सिर्फ स्ट्रीम ऑपरेटरों के माध्यम से सामान प्रिंट करता है। – Xeo
यह सुरक्षित है कि 'टी' हमेशा पारित पैरामीटर का प्रकार होगा। मानक printf नहीं जानता है। –
एक तरफ के रूप में, यह एक भयानक टाइपएफ़ 'printf' कार्यान्वयन है।यह प्रारूप विनिर्देशकों को अनदेखा करता है और गलत व्याख्या करता है, और अस्थायी मूल्यों को आगे बढ़ाने का भी समर्थन नहीं करता है! संक्षेप में, यह एक टाइपएफ़ फ़ंक्शन है, लेकिन यह इसके नाम के बावजूद 'printf' का वैध कार्यान्वयन नहीं है। एक अच्छा टाइपएफ़ 'printf' सुरक्षित होने पर 'printf' के समान व्यवहार करेगा, और असुरक्षित मामलों में अपरिभाषित करने में विफल रहेगा। – Yakk