मैंने हाल ही में सी ++ 11 वैरिएडिक टेम्पलेट फ़ंक्शन उपयोग को चित्रित करने के लिए यह उदाहरण कोड बनाया है।अग्रेषित घोषित टेम्पलेट कार्यों की आवश्यकता
template <typename Head, typename... Tail> void foo (Head, Tail...);
template <typename... Tail> void foo (int, Tail...);
void foo() {}
template <typename... Tail>
void foo (int x, Tail... tail)
{
std :: cout << "int:" << x;
foo (tail...);
}
template <typename Head, typename... Tail>
void foo (Head x, Tail... tail)
{
std :: cout << " ?:" << x;
foo (tail...);
}
foo (int (123), float (123)); // Prints "int:123 ?:123.0"
तो पहले दो लाइनों जो आगे की घोषणा foo
छोड़े गए हैं तो यह बजाय int:123int:123
प्रिंट करता है। यह एक निश्चित अनुभवी और जानकार सी ++ प्रोग्रामर आश्चर्यचकित हुआ।
वह आश्वस्त था कि आगे की घोषणाओं को जरूरी नहीं होना चाहिए क्योंकि शरीर को दो चरण के लुकअप के दूसरे चरण तक तत्काल नहीं किया जाएगा। वह सोचता है कि कंपाइलर (जीसीसी 4.6) में एक बग है।
मेरा मानना है कि संकलक सही है क्योंकि दो foo
different base template functions कर रहे हैं और मूल टेम्पलेट के चुनाव पहले चरण के दौरान बंद कर दिया-इन करने की जरूरत है या फिर आप इसे के सभी संस्करणों से पहले foo
instantiating द्वारा एक परिभाषा नियम का उल्लंघन कर सकता है परिभाषित किया गया है और फिर बाद में (विचार करें कि लिंकर मानता है कि अनावश्यक टेम्पलेट फ़ंक्शन परिभाषाएं समान, विनिमय करने योग्य और निष्कासित हैं)।
तो, कौन सही है?
ऊपर से जुड़े GOTW अच्छी तरह से बताते हैं कि कैसे और क्यों समारोह टेम्पलेट्स आंशिक रूप से विशेषज्ञ नहीं है, लेकिन variadic टेम्पलेट कार्यों के अस्तित्व भ्रम में जोड़ने के लिए लगता है - कि foo<int,Tail...>
के एक आंशिक विशेषज्ञता होना चाहिए अंतर्ज्ञान foo<Head,Tail...>
कम से कम मेरे लिए गैर-भिन्न कार्यों के लिए अंतर्ज्ञान से अधिक मजबूत है।
Fwiw, बजना ++ जीसीसी के रूप में ही उत्पादन पैदा करता है। – Cubbi
मैं बिल्कुल यकीन नहीं है, लेकिन ऐसा लगता है कि जब foo() कहा जाता है, यह foo (पूंछ ...) foo (int, पूंछ ...) जो तब की कोशिश करता है का दृष्टांत और चाहिए जब आगे घोषणा वहाँ नहीं है , यह foo (हेड, टेल ...) नहीं देखेगा और केवल foo (int, tail ...) को चुना जा सकता है ... आप बार (x) पर कॉल भी जोड़ सकते हैं; foo में (int, पूंछ ...) और फिर एक बार() सभी foo() फ़ंक्शन के बाद घोषित ... यह नहीं मिलेगा भी – PlasmaHH