आप एक हेडर के बिना कर सकते हैं:
using size_t = decltype(sizeof(int));
using size_t = decltype(sizeof 1); // The shortest is my favourite.
using size_t = decltype(sizeof "anything");
ऐसा इसलिए है क्योंकि C ++ मानक की आवश्यकता है:
का परिणाम है sizeofऔर sizeof...एक प्रकार का एक निरंतर है std::size_t। [नोट: std::size_tमानक हेडर <cstddef>(18.2) में परिभाषित किया गया है । - अंतिम नोट]
दूसरे शब्दों में, मानक की आवश्यकता है:
static_assert(std::is_same<decltype(sizeof(int)), std::size_t>::value,
"This never fails.");
यह भी ध्यान दें, कि यह typedefघोषणा वैश्विक और stdनेमस्पेस में पूरी तरह से ठीक है , जब तक कि यह typedefएक ही टाइप-बीफ-नाम की अन्य सभी घोषणाओं से मेल नहीं खाता (गैर संकलित घोषणाओं पर एक संकलक त्रुटि जारी) ।
यह है क्योंकि:
Ed7.1.3.1 टाइपसेफ -नाम एक नए प्रकार को क्लास डिक्लेरेशन (9.1) या एनम डिक्लेयर करने के तरीके को पेश नहीं करता है।
§7.1.3.3 किसी दिए गए गैर-श्रेणी के दायरे में, एक विशेषांक का typedefउपयोग उस दायरे में घोषित किसी भी प्रकार के नाम को फिर से परिभाषित करने के लिए किया जा सकता है , जिस प्रकार से यह पहले से ही संदर्भित है।
संशयवादियों का कहना है कि यह नाम स्थान में एक नए प्रकार का जोड़ है std, और इस तरह के एक कार्य को मानक द्वारा स्पष्ट रूप से निषिद्ध है, और यह यूबी है और यह सब वहां है; मेरा कहना है कि यह रवैया अंतर्निहित मुद्दों की गहरी समझ को अनदेखा करने और इनकार करने के लिए है।
मानक नए नामों और परिभाषाओं को नाम स्थान में जोड़ने पर प्रतिबंध लगाते हैं stdक्योंकि ऐसा करने से उपयोगकर्ता मानक पुस्तकालय की गड़बड़ी कर सकता है और अपने पूरे पैर को बंद कर सकता है। मानक लेखकों के लिए उपयोगकर्ता को कुछ विशिष्ट चीजों को विशेषज्ञ बनाने और अच्छे उपाय के लिए कुछ और करने पर प्रतिबंध लगाने के बजाय हर एक चीज़ पर प्रतिबंध लगाने के लिए आसान था, जो उपयोगकर्ता को नहीं करना चाहिए और जोखिम को कुछ महत्वपूर्ण (और उस पैर) को याद नहीं करना चाहिए। उन्होंने अतीत में ऐसा किया था जब किसी भी मानक कंटेनर को अपूर्ण प्रकार के साथ त्वरित नहीं किया जाएगा, जबकि वास्तव में कुछ कंटेनर अच्छी तरह से कर सकते हैं (देखें मानक लाइब्रेरियन: मैथ्यू एच। ऑस्टर्न द्वारा अपूर्ण प्रकार के कंटेनर ):
... अंत में, यह सब बहुत बुरा लग रहा था और बहुत खराब समझा गया था; मानकीकरण समिति ने यह नहीं कहा कि एसटीएल कंटेनरों को अपूर्ण प्रकारों के साथ काम करने के लिए कहने के अलावा कोई विकल्प नहीं था। अच्छे उपाय के लिए, हमने उस प्रतिबंध को बाकी मानक पुस्तकालय में भी लागू किया।
... रेट्रोस्पेक्ट में, अब जब तकनीक बेहतर समझ में आ रही है, तो यह निर्णय अभी भी मूल रूप से सही लगता है। हां, कुछ मामलों में कुछ मानक कंटेनरों को लागू करना संभव है, ताकि उन्हें अपूर्ण प्रकारों के साथ त्वरित किया जा सके - लेकिन यह भी स्पष्ट है कि अन्य मामलों में यह मुश्किल या असंभव होगा। यह ज्यादातर मौका था कि हमने पहले परीक्षण की कोशिश की, उपयोग करते हुए std::vector, आसान मामलों में से एक हुआ।
यह देखते हुए कि भाषा के नियमों का std::size_tठीक होना आवश्यक है decltype(sizeof(int)), ऐसा namespace std { using size_t = decltype(sizeof(int)); }करना उन चीजों में से एक है जो कुछ भी नहीं तोड़ती हैं।
C ++ 11 से पहले , एक सरल कथन में परिणाम decltypeके प्रकार को घोषित करने का कोई तरीका नहीं था और sizeofइसमें शामिल किए गए टेम्पलेट्स का एक अच्छा सौदा प्राप्त किए बिना। size_tअलग-अलग लक्ष्य आर्किटेक्चर पर उपनाम अलग-अलग होते हैं, हालांकि, यह केवल परिणाम के लिए एक नए अंतर्निहित प्रकार को जोड़ने के लिए एक सुरुचिपूर्ण समाधान नहीं होगा sizeof, और कोई मानक निर्मित-टाइप किए गए पंखे नहीं हैं। इसलिए, उस समय का सबसे पोर्टेबल समाधान size_tकुछ विशिष्ट हेडर और दस्तावेज़ में टाइप उर्फ डालना था ।
C ++ 11 में अब एक सरल घोषणा के रूप में मानक की उस सटीक आवश्यकता को लिखने का एक तरीका है।