เท่าที่ฉันรู้ เนื่องจาก C++17 โครงสร้างข้อมูล STL บางส่วนอาจมี "อยู่" โดยมีประเภทที่ไม่สมบูรณ์เป็นพารามิเตอร์เทมเพลตซึ่งอธิบายประเภทที่เก็บไว้ ตัวอย่างเช่น ฉันอาจใช้ std::unique_ptr<Incomplete>
(ฉันไม่แน่ใจว่ามันเป็นโครงสร้างข้อมูลหรือไม่) หรือ std::vector<Incomplete>
เป็นสมาชิกคลาส หากคุณสมบัติทั้งหมดของคลาส (ซึ่งต้องการคำจำกัดความของ Incomplete
) ถูกนำไปใช้ในไฟล์ .cpp แยกต่างหาก:
class Incomplete;
using Complete = int;
class Foo {
private:
std::unique_ptr<Incomplete> u_p;
std::vector<Incomplete> v;
std::deque<Incomplete> d;
std::list<Incomplete> l;
std::set<Incomplete> s;
std::unordered_map<Complete, Complete> u_m_cc;
std::unordered_map<Complete, Incomplete> u_m_ci;
std::unordered_map<Incomplete, Complete> u_m_ic;
std::unordered_map<Incomplete, Incomplete> u_m_ii;
public:
// implemented in a separate .cpp which has Incomplete defined:
Foo();
Foo(Foo&&);
Foo& operator=(Foo&&);
Foo(Foo const&);
Foo& operator=(Foo const&);
~Foo();
};
ดังนั้นสมาชิกข้อมูลใดที่ระบุไว้ข้างต้นที่ถูกต้องสำหรับการใช้งานดังกล่าว แล้วโครงสร้างข้อมูลอื่นๆ ตัวชี้อัจฉริยะ ฯลฯ ล่ะ?
std::vector
และstd::unique_ptr
ไม่เป็นไรstd::unordered_map
ปฏิเสธที่จะทำงานกับ MSVC ของฉัน: std::pair ใช้ struct ที่ไม่สมบูรณ์ แม้ว่าจะมีการคอมไพล์บางอย่าง แต่ก็ไม่รับประกันว่าจะอยู่ในมาตรฐาน นั่นคือปัญหาที่ฉันเห็นในการทดสอบดังกล่าว - person passing_through   schedule 01.02.2020std::pair
คือ POD ดังนั้นคอนเทนเนอร์ใดๆ ที่มีstd::pair
เป็นสมาชิกจะไม่ทำงานกับประเภทที่ไม่สมบูรณ์ ข้อยกเว้นที่น่าสนใจอย่างหนึ่งคือunion
โดยที่การจัดสรรอยู่บนสแต็ก แต่สมาชิกคนแรกของรายการสหภาพต้องเป็นประเภทที่สมบูรณ์ ส่วนอื่นๆ อาจไม่สมบูรณ์ก็ได้ ถ้าฉันจำได้std::optional
ใช้ประโยชน์จากคุณสมบัตินี้ - person cplusplusrat   schedule 01.02.2020std::pair
เอง ไม่ใช่สมาชิก เช่นเดียวกับประเภทอื่นๆstd::pair
เองก็สามารถอยู่บนสแต็กหรือฮีปได้ ฉันพูดถึงเรื่องนั้นเพราะว่าสองสามประโยคแรกในความคิดเห็นที่ฉันตอบกลับไป มันฟังดูราวกับว่าstd::pair
การเป็นเรื่องเล็กน้อยทำให้std::unordered_map
ไม่สามารถยอมรับประเภทที่ไม่สมบูรณ์ได้ ซึ่งเท่าที่ฉันสามารถบอกได้ไม่ใช่ในกรณีนี้ - person walnut   schedule 02.02.2020