मैं अपने C ++ प्रोग्राम्स में फॉरवर्ड- और बैकवर्ड-कम्पैटिबिलिटी के स्तर को बनाए रखते हुए एक अच्छे के लिए काम कर रहा हूं, जब तक कि मुझे अंततः इसके लिए लाइब्रेरी टूलकिट नहीं बनाना पड़ता , जिसे मैं रिलीज़ करने की तैयारी कर रहा हूं । सामान्य तौर पर, जब तक आप स्वीकार करते हैं कि आपको "पूर्ण" फॉरवर्ड-संगतता नहीं मिलेगी, न ही फीचर्स में (कुछ चीजों को केवल आगे-अनुकरण नहीं किया जा सकता है) सिंटैक्स में नहीं (आपको संभवतः मैक्रोज़, वैकल्पिक नामस्थान का उपयोग करना होगा कुछ चीजें) तो आप सब तैयार हैं।
वहाँ सुविधाओं का एक अच्छा है कि C ++ 03 में एक स्तर है कि व्यावहारिक उपयोग के लिए पर्याप्त है में अनुकरण किया जा सकता है - और बिना किसी परेशानी के जो कि उदाहरण के लिए आता है: बूस्ट। हेक, यहां तक कि C ++ मानकों का प्रस्ताव nullptr
C ++ 03 बैकपोर्ट के लिए सुझाव देता है। और फिर सब कुछ के लिए उदाहरण के लिए TR1 है C ++ 11 ‑ लेकिन ‑ हमारे पास ‑ ‑ वर्षों के सामान के लिए ‑ पूर्वावलोकन हैं। इतना ही नहीं, कुछ C ++ 14 में मुखर वेरिएंट, पारदर्शी फंक्शनलर्स जैसे फीचर्स और C ++ 03 में लागू किए जा optional
सकते हैं!
केवल दो चीजें जो मुझे पता है कि बिल्कुल बैकपार्ट नहीं की जा सकती हैं वे हैं कॉन्स्टैक्स और वेरैडिक टेम्पलेट।
नेमस्पेस में सामान जोड़ने के पूरे मामले के संबंध में std
, मेरा विचार यह है कि इससे कोई फर्क नहीं पड़ता - बिल्कुल भी नहीं । बूस्ट के बारे में सोचो, सबसे महत्वपूर्ण और प्रासंगिक C ++ पुस्तकालयों में से एक, और TR1 का उनका कार्यान्वयन: Boost.Tr1। यदि आप C ++ में सुधार करना चाहते हैं, तो इसे C ++ 11 के साथ संगत करें, तो परिभाषा के अनुसार आप इसे ऐसी चीज़ में बदल रहे हैं जो C ++ 03 नहीं है, इसलिए अपने आप को एक मानक से अधिक अवरुद्ध करें जिसे आप किसी भी तरह से बचने या छोड़ने का इरादा रखते हैं। , सीधे शब्दों में कहें तो उल्टा। शुद्धतावादी शिकायत करेंगे, लेकिन परिभाषा के अनुसार किसी को उनकी परवाह नहीं करनी चाहिए।
बेशक, सिर्फ इसलिए कि आप (03) मानक का पालन नहीं करेंगे, इसका मतलब यह नहीं है कि आप कोशिश नहीं कर सकते हैं, या उल्लासपूर्वक इसे तोड़ने के लिए नहीं जाएंगे। ये मुद्दा नहीं है। इसलिए जब तक आप std
नेमस्पेस में जोड़ा जाता है तब तक बहुत सावधानी से नियंत्रण रखें , और उन वातावरण का नियंत्रण रखें जहां आपके सॉफ़्टवेयर का उपयोग किया जाता है (यानी: परीक्षण करते हैं!), किसी भी तरह का कोई भी अहितकर नुकसान नहीं होना चाहिए। यदि संभव हो तो, एक अलग नामस्थान में सब कुछ परिभाषित करें और केवल नामस्थान में using
निर्देश जोड़ें std
ताकि आप वहां कुछ भी नहीं जोड़ रहे हैं जो "बिल्कुल" अंदर जाने की आवश्यकता है। कौन सा, IINM, कम या ज्यादा Boost.TR1 करता है।
अद्यतन (२०१३) : मूल प्रश्न के अनुरोध के रूप में और कुछ टिप्पणियों को देखते हुए जिन्हें मैं निरसन की कमी के कारण नहीं जोड़ सकता, यहां C ++ 11 और C ++ 14 विशेषताओं की सूची है और उनकी पोर्टेबिलिटी की डिग्री है से सी ++ 03:
nullptr
: आधिकारिक समिति के बैकपोर्ट को पूरी तरह से लागू करने योग्य; आपको संभवतः कुछ टाइप_ट्रेट्स विशेषज्ञता प्रदान करनी होगी ताकि इसे "मूल" प्रकार के रूप में पहचाना जा सके।
forward_list
: पूरी तरह से लागू करने योग्य, हालांकि आवंटनकर्ता का समर्थन इस पर निर्भर करता है कि आपका ट्र 1 इम्प्लांटेंटेशन क्या प्रदान कर सकता है।
- नए एल्गोरिदम (विभाजन_कोपी, आदि): पूरी तरह से लागू करने योग्य।
- ब्रेस-सीक्वेंस (उदाहरण :) से कंटेनर कंस्ट्रक्शन
vector<int> v = {1, 2, 3, 4};
: पूरी तरह से लागू करने योग्य, हालांकि एक से अधिक वर्डियर चाहेंगे।
static_assert
: मैक्रो के रूप में लागू होने पर लगभग पूरी तरह से लागू करने योग्य (आपको केवल अल्पविराम से सावधान रहना होगा)।
unique_ptr
: लगभग पूरी तरह से लागू करने योग्य, लेकिन आपको कॉलिंग कोड (कंटेनर में उन्हें संग्रहीत करने के लिए आदि) से भी समर्थन की आवश्यकता होगी; हालांकि नीचे देखें।
- rvalue-reference: आप उनसे कितना प्राप्त करने की उम्मीद करते हैं (उदाहरण: बूस्ट मूव) के आधार पर लगभग पूरी तरह से लागू करने योग्य।
- Foreach iteration: पूरी तरह से लागू करने योग्य, वाक्यविन्यास कुछ अलग होगा।
- तर्कों के रूप में स्थानीय कार्यों का उपयोग करना (उदाहरण के लिए: ट्रांसफ़ॉर्म करना): निकट-पूरी तरह से लागू करने योग्य, लेकिन वाक्यविन्यास पर्याप्त रूप से भिन्न होगा - उदाहरण के लिए, स्थानीय फ़ंक्शन कॉल साइट पर परिभाषित नहीं हैं, लेकिन ठीक पहले।
- स्पष्ट रूपांतरण ऑपरेटर: व्यावहारिक स्तर पर लागू (रूपांतरण को स्पष्ट किया जा रहा है), इम्परफेक्ट C ++ का "स्पष्ट_कास्ट" देखें; लेकिन भाषा की विशेषताओं के साथ एकीकरण
static_cast<>
निकट-असंभव हो सकता है।
- तर्क अग्रेषण: व्यावहारिक स्तर पर लागू किया गया है जो ऊपर दिए गए संदर्भ-संदर्भों पर दिया गया है, लेकिन आपको अपने तर्कों को आगे बढ़ाने के लिए एन ओवरलोड प्रदान करना होगा।
- चाल: व्यावहारिक स्तर पर लागू करने योग्य (दो एब्स देखें)। बेशक, आपको इससे लाभ के लिए संशोधक कंटेनरों और वस्तुओं का उपयोग करना होगा।
- बंद आवंटनकर्ता: वास्तव में लागू करने योग्य नहीं है जब तक कि आपका Tr1 कार्यान्वयन इसकी सहायता नहीं कर सकता है।
- मल्टीबाइट चरित्र प्रकार: वास्तव में लागू नहीं जब तक कि आपका ट्र 1 आपको समर्थन नहीं दे सकता। लेकिन अभीष्ट उद्देश्य के लिए विशेष रूप से मामले से निपटने के लिए डिज़ाइन की गई लाइब्रेरी पर भरोसा करना बेहतर है, जैसे कि ICU, भले ही C ++ 11 का उपयोग कर रहे हों।
- वैरिएड तर्क सूची: कुछ परेशानी के साथ लागू करने योग्य, तर्क अग्रेषण पर ध्यान दें।
noexcept
: आपके कंपाइलर की विशेषताओं पर निर्भर करता है।
- नया
auto
शब्दार्थ और decltype
: आपके संकलक की विशेषताओं पर निर्भर करता है - उदा __typeof__
. : ।
- आकार पूर्णांक प्रकार (
int16_t
, आदि): आपके संकलक की विशेषताओं पर निर्भर करता है - या आप पोर्टेबल stdint.h पर प्रतिनिधि कर सकते हैं।
- प्रकार विशेषताएँ: आपके संकलक की विशेषताओं पर निर्भर करती है।
- प्रारंभिक सूची: मेरे ज्ञान के लिए लागू नहीं; लेकिन अगर आप जो चाहते हैं वह अनुक्रमों के साथ कंटेनरों को शुरू करना है, तो "कंटेनर निर्माण" पर उपरोक्त देखें।
- टेम्प्लेट एलियासिंग: मेरे ज्ञान के लिए लागू करने योग्य नहीं है, लेकिन यह वैसे भी एक अनावश्यक विशेषता है, और हमने
::type
हमेशा के लिए टेम्पलेट्स में
- Variadic टेम्पलेट्स: मेरे ज्ञान के लिए लागू नहीं; करीब टेम्पलेट तर्क डिफ़ॉल्ट है, जिसके लिए एन विशेषज्ञता की आवश्यकता होती है, आदि।
constexpr
: मेरे ज्ञान के लिए लागू नहीं।
- यूनिफ़ॉर्म इनिशियलाइज़ेशन: मेरे ज्ञान के लिए लागू नहीं है, लेकिन गारंटीकृत डिफ़ॉल्ट -कॉन्स्ट्रक्टर आरंभीकरण को एला बूस्ट के मूल्य-इनिशियलाइज़ किए जा सकते हैं।
- सी ++ 14
dynarray
: पूरी तरह से लागू करने योग्य।
- C ++ 14
optional<>
: जब तक आपका C ++ 03 कंपाइलर संरेखण सेटअप का समर्थन करता है, तब तक पूरी तरह से लागू होने योग्य है।
- C ++ 14 पारदर्शी फ़ंक्शनलर्स: लगभग पूरी तरह से लागू करने योग्य, लेकिन आपके क्लाइंट कोड को स्पष्ट रूप से उदाहरण के
std::less<void>
लिए उपयोग करना होगा।
- C ++ 14 नए मुखर वेरिएंट (जैसे
assure
): पूरी तरह से लागू करने योग्य यदि आप दावा करते हैं, तो लगभग पूरी तरह से लागू करने योग्य है यदि आप इसके बजाय थ्रो को सक्षम करना चाहते हैं।
- C ++ 14 टूपल एक्सटेंशन (टाइप करके टपल एलीमेंट प्राप्त करें): पूरी तरह से लागू करने योग्य, और आप इसे फीचर प्रस्ताव में वर्णित सटीक मामलों के संकलन में विफल होने के लिए भी प्राप्त कर सकते हैं।
(अस्वीकरण: इन सुविधाओं में से कई मेरे सी ++ बैकग्राउंड लाइब्रेरी में कार्यान्वित की जाती हैं जिन्हें मैंने ऊपर लिंक किया है, इसलिए मुझे लगता है कि मुझे पता है कि मैं किस बारे में बात कर रहा हूं जब मैं "पूरी तरह से" या "निकट-पूर्ण" कहता हूं। "