วิธีรับจำนวนองค์ประกอบใน std :: array <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

@ShadowRanger เพราะsizeof(std::array<T, N>) == N * sizeof(T)ไม่จำเป็นต้องเป็นจริง
NathanOliver

เพราะอาเรย์อาจถูกพิมพ์ที่อื่นหรือถูกส่งเป็นอาร์กิวเมนต์ไปยังเทมเพลต
dragonroot

1
Nหากคุณต้องการที่จะทราบจำนวนขององค์ประกอบเพียงใช้
JohnFilleau

1
@dragonroot อะไรคือประเด็นของเรื่องทั้งหมดนี้? หากคุณต้องNเริ่มต้นด้วยไม่มีความจำเป็นที่จะต้องดำเนินการทั้งหมดนี้เพื่อรับNทางอ้อมหรือตรวจสอบสิ่งN==Nนั้น กรณีการใช้งานจริงที่คุณพยายามแก้ไขคืออะไร
Remy Lebeau

คำตอบ:


14

std::tuple_size<std::array>มี

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

จะไม่ธรรมดามาตรฐาน :: ขนาด ()ทำอะไร
Jesper Juhl

2
@JesperJuhl ที่จริงไม่std::size()ต้องการอินสแตนซ์ของอาร์เรย์
0x499602D2

1
มันไม่สมเหตุสมผลที่จะใช้tuple_sizeสิ่งนี้แม้ว่าคุณจะรู้ขนาดอาร์เรย์ที่อยู่ข้างหน้าแล้วเพื่อส่งผ่านเข้าไปในเทมเพลต บางทีนี่อาจเป็นตัวอย่างที่มีความหมายมากกว่านี้ใช่ไหม using ArrayType = std::array<int, 5>; ... static_assert(std::tuple_size<ArrayType>::value == 5);
Remy Lebeau

@RemyLebeau ฉันเดา O / P คิดว่า array declare ถูกส่งผ่านเป็นอาร์กิวเมนต์แม่แบบไปยังฟังก์ชั่นแม่แบบ? แม้กระนั้นวัตถุประสงค์เดียวที่ฉันเห็นก็คือการกำหนดให้เป็นวัตถุที่ส่งคืนซึ่งยังคงต้องการอินสแตนซ์ที่จะสร้าง
Gem Taylor
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.