template <class T, class U> decltype(*(T*)(0) * *(U*)(0)) mul(T x, U y) {
return x * y;
}
कोड का यह टुकड़ा स्ट्रॉस्ट्रप के C++11 FAQ से लिया गया था। मैं समझता हूं कि यह क्या करता है, जो विभिन्न प्रकार की दो वस्तुओं को गुणा करता है। टेम्पलेट पैरामीटर और फ़ंक्शन परिभाषा के बीच सिंटैक्स मुझे क्या परेशान करता है। decltype
के अंदर क्या हो रहा है? मैं इसे लेता हूं कि यह एक अनमोल T
पॉइंटर को 0 से शुरू किया गया है, और इसे बिना किसी नामित U
पॉइंटर को गुणा किया जा रहा है और उसी तरह प्रारंभ किया गया है। क्या मैं सही हू?अज्ञात टेम्पलेट प्रकारों के साथ भ्रमित वाक्यविन्यास?
ठीक है, यदि यह हो रहा है, तो पॉइंटर्स, ड्रेरेन्शन और अतिरिक्त ब्रांड्स का उपयोग नहीं किया जाता है? मैं इस तरह प्रकार से प्रारंभ नहीं किया जा सका है, जबकि वांछित प्रभाव ?:
template <class T, class U> decltype(T(0) * U(0)) mul(T x, U y) {
return x * y;
}
यह बहुत मेरे लिए क्लीनर लग रहा है को बनाए रखने, और यह करता जब पहली में की तरह दो नंबर गुणा एक ही प्रभाव है ...
mul(4, 3); // 12
तो क्यों Stroustrup जटिल सूचक, भिन्नता और आरंभीकरण सिंटेक्स के उपयोग पर जोर देते है? यह निश्चित रूप से, नए auto
वाक्यविन्यास पेश करने से पहले है। लेकिन वैसे भी, मेरा प्रश्न है: क्या उपर्युक्त प्रकार के प्रारंभिक रूपों के बीच कोई अंतर है? जहां वह पॉइंटर्स का उपयोग करता है और जो कुछ मैंने किया है, उसके बजाए तुरंत उन्हें संदर्भित करता है, जो किसी भी पॉइंटर्स या डिफरेंसिंग वाले प्रकारों को प्रारंभ करना था? किसी भी प्रतिक्रिया की सराहना की है।
क्या होता है जब 'टी' दिया जाता है जो 'int' से रचनात्मक नहीं है? –