2012-01-20 6 views
11

के साथ बदलें क्या किसी ने स्क्रिप्ट, प्लगइन, या निष्पादन योग्य लिखा है जो 'ऑटो' के प्रत्येक उदाहरण को संकलक-प्रेरित प्रकार के साथ बदल देता है? मुझे कुछ सी ++ 11 कोड पोर्ट करने की आवश्यकता है जो पूरे स्थान पर ऑटो का उपयोग करता है।ऑटो कीवर्ड को घटाए गए प्रकार (क्लैंग या वीएस -2010)

क्लैंग मेरा पहला उम्मीदवार है। क्या किसी ने इसे ऐसा करने के लिए संशोधित किया है?

एक विकल्प संकलक से त्रुटियों का विश्लेषण करना है क्योंकि अपेक्षित प्रकार त्रुटि आउटपुट में हो सकता है। मैं -Dauto=int और संभवतः वापस "could not convert std::vector<int>::iterator to 'int'"

+5

संभावना नहीं है। हम सी ++ 11 को बंदरगाह सॉफ़्टवेयर करते हैं, सी ++ 11 से नहीं। –

+0

यह भी संभव नहीं है - टेम्पलेट्स के भीतर नहीं जहां प्रकार टेम्पलेट पैरामीटर पर निर्भर करता है। – sellibitze

+1

लेकिन जहां तक ​​मुझे पता है, विजुअलस्टूडियो आपको उस प्रकार के बारे में बताने के लिए पर्याप्त स्मार्ट है यदि आप अपने माउस के साथ चर पर होवर करते हैं - जब तक कि यह निश्चित रूप से टेम्पलेट पैरामीटर पर निर्भर न हो। – sellibitze

उत्तर

8

दुर्भाग्यवश, सामान्य मामले में यह असंभव है। पर विचार करें:

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