(หมายเหตุ: คำถามนี้เป็นคำถามเกี่ยวกับการไม่ต้องระบุจำนวนขององค์ประกอบและยังคงอนุญาตให้มีชนิดที่ซ้อนกันที่จะเริ่มต้นได้โดยตรง.)
คำถามนี้กล่าวถึงการใช้งานที่เหลือสำหรับอาร์เรย์ C int arr[20];
เช่น ในคำตอบของเขา @James Kanze แสดงหนึ่งในฐานที่มั่นสุดท้ายของอาร์เรย์ C มันเป็นลักษณะการเริ่มต้นที่ไม่ซ้ำกัน:
int arr[] = { 1, 3, 3, 7, 0, 4, 2, 0, 3, 1, 4, 1, 5, 9 };
เราไม่ต้องระบุจำนวนองค์ประกอบไชโย! ทีนี้วนซ้ำด้วยฟังก์ชัน C ++ 11 std::begin
และstd::end
จาก<iterator>
( หรือตัวแปรของคุณเอง ) และคุณไม่จำเป็นต้องคิดถึงขนาดของมัน
ตอนนี้มีวิธีใดบ้าง (ที่เป็นไปได้ของ TMP) ในการบรรลุเป้าหมายเดียวกันstd::array
หรือไม่? อนุญาตให้ใช้มาโครเพื่อทำให้ดูดีขึ้น :)
??? std_array = { "here", "be", "elements" };
แก้ไข : เวอร์ชันกลางรวบรวมจากคำตอบที่หลากหลายมีลักษณะดังนี้:
#include <array>
#include <utility>
template<class T, class... Tail, class Elem = typename std::decay<T>::type>
std::array<Elem,1+sizeof...(Tail)> make_array(T&& head, Tail&&... values)
{
return { std::forward<T>(head), std::forward<Tail>(values)... };
}
// in code
auto std_array = make_array(1,2,3,4,5);
และใช้งาน C ++ 11 สุดเจ๋งทุกชนิด:
- เทมเพลต Variadic
sizeof...
- การอ้างอิงค่า
- ส่งต่อที่สมบูรณ์แบบ
std::array
, แน่นอน- การเริ่มต้นเครื่องแบบ
- ละเว้นประเภทส่งคืนด้วยการกำหนดค่าเริ่มต้นสม่ำเสมอ
- การอนุมานประเภท (
auto
)
และตัวอย่างที่สามารถพบได้ที่นี่
อย่างไรก็ตามเนื่องจาก @Johannes ชี้ให้เห็นในความคิดเห็นเกี่ยวกับคำตอบของ @ Xaade คุณจะไม่สามารถเริ่มต้นประเภทซ้อนกันได้ด้วยฟังก์ชันดังกล่าว ตัวอย่าง:
struct A{ int a; int b; };
// C syntax
A arr[] = { {1,2}, {3,4} };
// using std::array
??? std_array = { {1,2}, {3,4} };
นอกจากนี้จำนวนของ initializers ถูก จำกัด ไว้ที่จำนวนฟังก์ชันและอาร์กิวเมนต์เทมเพลตที่สนับสนุนโดยการนำไปใช้งาน
TMP
คำถามของคุณคืออะไร