Std में तत्वों की संख्या कैसे प्राप्त करें :: सरणी <T, N> बिना इसका उदाहरण बनाए?


9

वहाँ है std::array<T, N>::size(), लेकिन यह गैर-स्थिर है, इसलिए इसे एक उदाहरण की आवश्यकता है std::array। क्या कोई ऐसा तरीका है जिससे वह मूल्य प्राप्त कर सकता है (जो कि Nहै std::array<T, N>) बिना सरणी का उदाहरण बनाए? सामान्य सरणी के लिए, मैं इस्तेमाल कर सकता था sizeof, लेकिन मुझे कोई गारंटी नहीं है कि sizeof(std::array<T, N>) == N * sizeof(T)यह सच है।


यदि आपके पास है N, तो आपको arrayइसे आपके लिए पुन: पेश करने के लिए कहने की आवश्यकता क्यों है ?
शैडो रेंजर

@ShadowRanger क्योंकि sizeof(std::array<T, N>) == N * sizeof(T)सच होना जरूरी नहीं है।
नाथनऑलिवर

क्योंकि सरणी को कहीं और टाइप किया जा सकता है या किसी टेम्पलेट के तर्क के रूप में पारित किया जा सकता है।
ड्रैगनपोर्ट

1
यदि आप तत्वों की संख्या जानना चाहते हैं, तो उपयोग करें N
JohnFilleau

1
@dragonroot हालांकि इस सब का क्या मतलब है? यदि आपको पहले से ही Nशुरू करना है, तो Nअप्रत्यक्ष रूप से प्राप्त करने के लिए , या इसे मान्य करने के लिए इस सब से गुजरने की कोई आवश्यकता नहीं है N==N। वास्तविक उपयोग मामला क्या है जिसे आप हल करने का प्रयास कर रहे हैं?
रेमी लेबेउ

जवाबों:


14

वहाँ है std::tuple_size<std::array>

static_assert(std::tuple_size<std::array<int, 5>>::value == 5);

सादे std :: size () नहीं करेंगे?
जेसपर जुहल

2
@JesperJuhl वास्तव में नहीं, std::size()सरणी के एक उदाहरण की आवश्यकता है।
0x499602D2

1
यह tuple_sizeइस तरह का उपयोग करने के लिए समझ में नहीं आता है , अगर आप पहले से ही टेम्पलेट में इसे पारित करने के लिए सामने आकार सरणी पता है। शायद यह एक अधिक सार्थक उदाहरण होगा? using ArrayType = std::array<int, 5>; ... static_assert(std::tuple_size<ArrayType>::value == 5);
रेमी लेबेउ

@RemyLebeau मुझे लगता है कि O / P सोच रहा है कि ऐलान किया गया है कि टेम्प्लेट फ़ंक्शन के लिए टेम्पलेट तर्क के रूप में पारित किया गया है? फिर भी मैं एकमात्र उद्देश्य यह देख सकता हूं कि इसे लौटी हुई वस्तु के रूप में आवंटित किया जाए, जिसके लिए अभी भी एक उदाहरण की आवश्यकता है।
जेम टेलर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.