दुर्भाग्यवश, सामान्य मामले में यह असंभव है। पर विचार करें:
template <typename T> void foo(T & t)
{
auto it = t.find(42);
...
}
...
std::map<int, int> m;
std::set<int> s;
...
foo(m);
foo(s);
बेशक एक व्यर्थ उदाहरण है, लेकिन यह पता चलता है कि कोई रास्ता नहीं पता है कि के साथ ऑटो को बदलने के लिए है कि, जब एक टैम्पलेट तर्क पर निर्भर है। std::map
और std::set
, संयोग से, एक ही नाम (iterator
) कि संबंधित इटरेटर के प्रकार के प्रतिनिधित्व की typedefs होते हैं, इसलिए typename T::iterator it
यहाँ काम करेगा, लेकिन आप एक T
कि इस तरह के एक typedef नहीं है के लिए foo
का दृष्टांत कर सकते हैं।
मानक पुस्तकालय कक्षाओं में कई typedefs वास्तव में जोड़ा गया था इससे पहले कि auto
आविष्कार किया गया था/सोद्देश्य ऐसे टेम्पलेट्स लिखे जाने की अनुमति देने के लिए, और आप एक संकलक कि auto
नहीं है से निपटने के लिए एक ही बात कर सकते हैं। लेकिन यह ऐसा कुछ नहीं है जिसे आप स्वचालित रूप से auto
के लिए एक कंपाइलर के लिए समर्थन जोड़ने के लिए तुलना किए बिना प्रयास कर सकते हैं ...
तब भी जब auto
टेम्पलेट प्रकार पर निर्भर नहीं है, तो इसे बदलने के लिए एक कठिन समस्या है ऐसा कुछ जो उपयोगकर्ता को समझ में आता है और पोर्टेबल है। लें:
std::map<int, int> m;
auto it = m.find(42);
auto
के लिए उचित प्रतिस्थापन std::map<int, int>::iterator
है, लेकिन अगर आप -Dauto=int
का उपयोग करें और संकलक त्रुटि संदेश को देखने के लिए, आप इसे std::_Rb_tree_iterator<std::pair<const int, int> >
की तरह कुछ के साथ बदलें चाहते हैं। यह मानक लाइब्रेरी का कार्यान्वयन विवरण है, पढ़ने में मुश्किल है और स्पष्ट रूप से पोर्टेबल नहीं है - आप नहीं चाहते हैं कि आपके कोड में।
अपने बहुत उदाहरण में, मेरी संकलक (जीसीसी 4.4.6) का कहना है:
error: cannot convert __gnu_cxx::__normal_iterator<int*, std::vector<int, std::allocator<int> > >
to int
in initialization
संभावना नहीं है। हम सी ++ 11 को बंदरगाह सॉफ़्टवेयर करते हैं, सी ++ 11 से नहीं। –
यह भी संभव नहीं है - टेम्पलेट्स के भीतर नहीं जहां प्रकार टेम्पलेट पैरामीटर पर निर्भर करता है। – sellibitze
लेकिन जहां तक मुझे पता है, विजुअलस्टूडियो आपको उस प्रकार के बारे में बताने के लिए पर्याप्त स्मार्ट है यदि आप अपने माउस के साथ चर पर होवर करते हैं - जब तक कि यह निश्चित रूप से टेम्पलेट पैरामीटर पर निर्भर न हो। – sellibitze