मैं अपनी कक्षा को स्पष्ट रूप से संदर्भित किए बिना पैरामीटर के आंतरिक प्रकार का अनुमान लगाने के लिए कैसे प्राप्त करूं? नीचे दिए गए न्यूनतम उदाहरण को देखें:

#include <vector>

template <class T> 
class foo {
public:
  foo(std::vector<T> &x) :
    _x(x) {
      T dummy = x.front(); // Trying to trick the compiler here
   }
private:
  std::vector<T> _x;
};

int main() {
  std::vector<int> a;
  foo<int> b(a);  // This works
  foo c(a);       // This fails
  return 0;
}

मैं देख रहा हूं कि foo को यह तर्क vector<int> होने की उम्मीद है, लेकिन यह मुझे T==[int] प्रकार का ऑब्जेक्ट बनाने देता है, इसलिए ऐसा लगता है कि यह जानता है कि आंतरिक प्रकार क्या है! इस तथ्य पर ध्यान न देते हुए कि dummy का असाइनमेंट विफल हो जाता है जब a खाली होता है ... मैं नेस्टेड आंतरिक प्रकार को कैसे संदर्भित कर सकता हूं?

0
Hooked 9 पद 2011, 00:09
मुझे सवाल समझ में नहीं आ रहा है। "नेस्टेड इनर टाइप" से आपका क्या मतलब है? नेस्टेड टेम्पलेट कहाँ है? आप किस प्रकार का अनुमान लगाना चाहते हैं? लाइन foo c(a), या कहीं और?
 – 
jalf
9 पद 2011, 00:13
क्षमा करें यदि शब्द अस्पष्ट है, या यदि मैंने अपनी शर्तों को भ्रमित किया है (कृपया मुझे सुधारें)। मैं लाइन को foo c(a) संकलित करना चाहता हूं, जबकि अब यह विफल हो जाता है क्योंकि foo का कोई प्रकार नहीं है।
 – 
Hooked
9 पद 2011, 00:16

1 उत्तर

सबसे बढ़िया उत्तर
foo c(a);       // This fails

स्पष्ट कारणों के लिए। foo एक क्लास टेम्प्लेट है, आप टेम्प्लेट पैरामीटर को नाम दिए बिना इसके किसी ऑब्जेक्ट को इंस्टेंट नहीं कर सकते।
यह फ़ंक्शन टेम्प्लेट की तरह नहीं है, जहां फ़ंक्शन तर्कों के माध्यम से टेम्प्लेट तर्कों का अनुमान लगाया जा सकता है। foo इस मामले में एक प्रकार (या चाहिए) का नाम है, न कि कंस्ट्रक्टर।

सी ++ 11 में, आप यह कर सकते हैं:

template<class T>
foo<T> make_foo(std::vector<T> const& x){
  return foo<T>(x);
}

// in main
auto f = make_foo(a);
3
Xeo 9 पद 2011, 00:24
उन पंक्तियों के साथ, क्या आप किसी फ़ंक्शन में निर्माण को लपेट सकते हैं और प्रकार को वापस करने के लिए केवल नए auto का उपयोग कर सकते हैं? क्या यह मानक अभ्यास है?
 – 
Hooked
9 पद 2011, 00:21
@ हुक: आप निश्चित रूप से सी ++ 11 में कर सकते हैं। मुझे यकीन नहीं है कि यह उपयोगी है, हालांकि। लेकिन आप इसे कर सकते हैं, कोई बात नहीं।
 – 
Xeo
9 पद 2011, 00:23
वास्तव में आप एक auto को वापस नहीं कर सकते क्योंकि यह एक प्रकार के लिए प्लेसहोल्डर है। auto का प्रकार आरंभीकरण के दौरान घटाया जाएगा, इसलिए इसे रिटर्न प्रकार या पैरामीटर के रूप में उपयोग नहीं किया जा सकता है।
 – 
AJG85
9 पद 2011, 01:12
@AJG: ओह, मैंने इस तरह की टिप्पणी की व्याख्या नहीं की, जैसा कि आप मेरे संपादन में देख सकते हैं। हालांकि अच्छा बिंदु।
 – 
Xeo
9 पद 2011, 01:14
मुझे पता है, मैं सिर्फ यह बताना चाहता था कि @Hooked स्पष्ट होने के लिए ;-)
 – 
AJG85
9 पद 2011, 01:17