ฉันทำงานได้ดีในขณะที่รักษาระดับของการส่งต่อ - และย้อนหลัง - ความเข้ากันได้ในโปรแกรม C ++ ของฉันจนกระทั่งในที่สุดฉันก็ต้องทำชุดเครื่องมือไลบรารีออกมาซึ่งฉันกำลังเตรียมที่จะออกวางจำหน่ายแล้ว โดยทั่วไปตราบใดที่คุณยอมรับว่าคุณจะไม่ได้รับความสมบูรณ์แบบของการส่งต่อ "สมบูรณ์แบบ" ไม่ได้อยู่ในคุณสมบัติ (บางสิ่งก็ไม่สามารถจำลองไปข้างหน้า) ไม่ได้อยู่ในไวยากรณ์ (คุณอาจจะต้องใช้มาโคร บางสิ่ง) จากนั้นคุณก็พร้อมแล้ว
มีคุณสมบัติที่ดีมากมายที่สามารถจำลองใน C ++ 03 ในระดับที่เพียงพอสำหรับการใช้งานจริง - และไม่มีความยุ่งยากทั้งหมดที่มาพร้อมกับเช่น: Boost Heck แม้แต่ข้อเสนอมาตรฐาน C ++ สำหรับnullptr
แนะนำ backport ของ C ++ 03 และมี TR1 เป็นตัวอย่างสำหรับทุกอย่าง C ++ 11 ‑ แต่ ‑ เรา ‑ มี ‑ ตัวอย่าง ‑ สำหรับ stuff ปี ไม่เพียงแค่นั้นคุณสมบัติC ++ 14บางอย่างเช่นชุดการยืนยันชุดฟังก์ชันโปร่งใสและoptional
สามารถใช้งานใน C ++ 03!
สองสิ่งเดียวที่ฉันรู้ว่าไม่สามารถย้อนกลับได้อย่างแน่นอนคือแม่แบบ constexpr และ variadic
เมื่อพิจารณาถึงเรื่องทั้งหมดของการเพิ่มรายการลงในเนมสเปซstd
มุมมองของฉันคือว่ามันไม่สำคัญเลย คิดถึง Boost ซึ่งเป็นหนึ่งในห้องสมุด C ++ ที่สำคัญและเกี่ยวข้องที่สุดและการใช้งาน TR1: Boost.Tr1 หากคุณต้องการปรับปรุง C ++ ให้เข้ากันได้กับ C ++ 11 จากนั้นตามคำนิยามคุณจะเปลี่ยนเป็นสิ่งที่ไม่ใช่ C ++ 03 ดังนั้นการบล็อกตัวเองเหนือมาตรฐานที่คุณตั้งใจจะหลีกเลี่ยง ใส่ง่ายต่อต้าน คนพิถีพิถันจะบ่น แต่โดยนิยามแล้วเราไม่จำเป็นต้องสนใจพวกเขา
แน่นอนเพียงเพราะคุณจะไม่ได้ดังต่อไปนี้ (03) มาตรฐานหลังจากทั้งหมดไม่ได้หมายความว่าคุณจะไม่สามารถลองหรือจะไปสำราญไปรอบ ๆ ทำลายมัน นั่นไม่ใช่ประเด็น. ตราบใดที่คุณควบคุมอย่างระมัดระวังเกี่ยวกับสิ่งที่เพิ่มไว้ในstd
เนมสเปซและมีการควบคุมสภาพแวดล้อมที่ใช้ซอฟต์แวร์ของคุณ (เช่น: ทำการทดสอบ!) ไม่ควรมีอันตรายใด ๆ หากเป็นไปได้ให้กำหนดทุกอย่างในเนมสเปซที่แยกต่างหากและเพิ่มเฉพาะusing
คำสั่งให้กับเนมสเปซstd
เพื่อที่คุณจะไม่เพิ่มสิ่งใดนอกเหนือไปจากสิ่งที่ "แน่นอน" จำเป็นต้องเข้าไป
Update (2013) : ตามคำขอของคำถามเดิมและเห็นความคิดเห็นบางส่วนที่ฉันไม่สามารถเพิ่มได้เนื่องจากการขาดตัวแทนนี่คือรายการของคุณสมบัติ C ++ 11 และ C ++ 14 และระดับการพกพา ถึง C ++ 03:
nullptr
: อย่างเต็มที่ implementable ให้ย้ายกลับอย่างเป็นทางการของคณะกรรมการ; คุณอาจจะต้องมีความเชี่ยวชาญเฉพาะด้าน type_traits เพื่อให้เป็นที่รู้จักในฐานะ "native"
forward_list
: สามารถนำไปใช้งานได้อย่างสมบูรณ์แม้ว่าการสนับสนุนตัวจัดสรรจะขึ้นอยู่กับการฝังตัวของ Tr1 ของคุณ
- อัลกอริธึมใหม่ (partition_copy ฯลฯ ): สามารถนำไปใช้ได้อย่างสมบูรณ์
- การสร้างตู้คอนเทนเนอร์จากวงเล็บปีกกา (เช่น:)
vector<int> v = {1, 2, 3, 4};
: สามารถนำไปใช้งานได้อย่างสมบูรณ์แม้ว่า wordier จะมากกว่าที่ต้องการ
static_assert
: สามารถนำไปใช้งานได้เกือบทั้งหมดเมื่อนำมาใช้เป็นมาโคร (คุณจะต้องระมัดระวังด้วยเครื่องหมายจุลภาค)
unique_ptr
: ใช้งานได้เกือบจะสมบูรณ์ แต่คุณจะต้องได้รับการสนับสนุนจากการเรียกรหัส (สำหรับการจัดเก็บในคอนเทนเนอร์ ฯลฯ ); ดูด้านล่างว่า
- การอ้างอิง rvalue: สามารถนำไปใช้งานได้อย่างใกล้ชิดขึ้นอยู่กับจำนวนที่คุณคาดหวังที่จะได้รับจากพวกเขา (เช่น: Boost Move)
- การทำซ้ำ Foreach: เกือบจะนำมาใช้อย่างเต็มที่ไวยากรณ์จะแตกต่างกันบ้าง
- ใช้ฟังก์ชั่นท้องถิ่นเป็นข้อโต้แย้ง (เช่น.. แปลง): ใช้งานได้เกือบเต็มรูปแบบ แต่ไวยากรณ์จะแตกต่างกันพอตัวอย่างเช่นฟังก์ชั่นท้องถิ่นไม่ได้กำหนดไว้ที่เว็บไซต์โทร แต่ก่อนหน้านี้
- ตัวดำเนินการแปลงที่ชัดเจน: สามารถนำไปใช้ในระดับปฏิบัติได้ (ทำให้เกิดการแปลงอย่างชัดเจน) ดู " C_ID_Crypt " ของC ++ ที่ไม่สมบูรณ์ แต่การรวมเข้ากับคุณสมบัติภาษาเช่น
static_cast<>
อาจเป็นไปไม่ได้
- การส่งต่ออาร์กิวเมนต์: นำไปใช้กับระดับการปฏิบัติที่ระบุไว้ข้างต้นเกี่ยวกับการอ้างอิง rvalue แต่คุณจะต้องให้การโอเวอร์โหลด N ฟังก์ชั่นของคุณโดยรับอาร์กิวเมนต์ที่สามารถส่งต่อได้
- ย้าย: นำไปใช้กับระดับการปฏิบัติ (ดูสอง aboves) แน่นอนคุณจะต้องใช้คอนเทนเนอร์ตัวดัดแปลงและวัตถุเพื่อทำกำไรจากสิ่งนี้
- ตัวจัดสรรที่กำหนดขอบเขต: ไม่สามารถนำไปใช้งานได้จริงเว้นแต่ว่าการใช้งาน Tr1 ของคุณสามารถช่วยเหลือได้
- ประเภทอักขระหลายไบต์: ไม่สามารถนำไปใช้งานได้จริงเว้นแต่ Tr1 ของคุณสามารถรองรับคุณได้ แต่สำหรับวัตถุประสงค์ที่ตั้งใจไว้จะดีกว่าที่จะใช้ไลบรารีที่ออกแบบมาเพื่อจัดการกับปัญหาเช่น ICU แม้ว่าจะใช้ C ++ 11 ก็ตาม
- รายการอาร์กิวเมนต์ Variadic: นำไปใช้กับความยุ่งยากได้บ้าง
noexcept
: ขึ้นอยู่กับคุณสมบัติของคอมไพเลอร์ของคุณ
- ใหม่
auto
ความหมายและdecltype
: ขึ้นอยู่กับคุณสมบัติคอมไพเลอร์ของคุณ - __typeof__
เช่น
- ประเภทจำนวนเต็มขนาด (
int16_t
, ฯลฯ ): ขึ้นอยู่กับคุณสมบัติของคอมไพเลอร์ของคุณ - หรือคุณสามารถมอบหมายให้ Portable stdint.h
- คุณสมบัติประเภท: ขึ้นอยู่กับคุณสมบัติของคอมไพเลอร์ของคุณ
- รายการเริ่มต้น: ไม่สามารถนำไปใช้กับความรู้ของฉันได้ อย่างไรก็ตามหากสิ่งที่คุณต้องการคือการเริ่มต้นภาชนะที่มีลำดับดูข้างต้นใน "การสร้างภาชนะ"
- การสร้างชื่อแทนเทมเพลต: ไม่สามารถนำความรู้ของฉันไปใช้ได้ แต่มันเป็นคุณสมบัติที่ไม่จำเป็นและเรามี
::type
ในแม่แบบตลอดไป
- เทมเพลต Variadic: ไม่สามารถนำไปใช้กับความรู้ของฉันได้ ปิดคือการเริ่มต้นอาร์กิวเมนต์แม่แบบซึ่งต้องมีความเชี่ยวชาญ N ฯลฯ
constexpr
: ไม่สามารถนำไปใช้กับความรู้ของฉัน
- การกำหนดค่าเริ่มต้นที่สม่ำเสมอ: ไม่สามารถนำไปใช้กับความรู้ของฉันได้ แต่การรับประกันการเริ่มต้น - ตัวสร้างเริ่มต้นสามารถนำมาใช้เป็นค่าเริ่มต้นของ Ala Boost ได้
- C ++ 14
dynarray
: สามารถนำไปใช้ได้อย่างสมบูรณ์
- C ++ 14
optional<>
: สามารถนำไปใช้งานได้เกือบสมบูรณ์ตราบใดที่คอมไพเลอร์ C ++ 03 ของคุณรองรับการตั้งค่าการจัดตำแหน่ง
- ฟังก์ชั่นโปร่งใส C ++ 14: นำไปใช้งานได้เกือบทั้งหมด แต่รหัสลูกค้าของคุณอาจจะต้องใช้อย่างชัดเจนเช่น:
std::less<void>
เพื่อให้มันใช้งานได้
- C ++ 14 ชุดการยืนยันใหม่ (เช่น
assure
): สามารถนำไปใช้ได้อย่างสมบูรณ์หากคุณต้องการการยืนยันและสามารถนำไปปฏิบัติได้อย่างเต็มที่หากคุณต้องการเปิดใช้งานการโยน
- ส่วนขยาย tuple C ++ 14 (รับองค์ประกอบ tuple ตามประเภท): สามารถนำไปใช้งานได้อย่างสมบูรณ์และคุณสามารถทำให้ล้มเหลวในการคอมไพล์ด้วยเคสที่แน่นอนที่อธิบายไว้ในข้อเสนอคุณสมบัติ
(ข้อจำกัดความรับผิดชอบ: คุณสมบัติหลายอย่างเหล่านี้ถูกนำไปใช้ในไลบรารี backport C ++ ของฉันที่ฉันได้เชื่อมโยงข้างต้นดังนั้นฉันคิดว่าฉันรู้ว่าฉันกำลังพูดถึงอะไรเมื่อฉันพูดว่า "เต็ม" หรือ "ใกล้เต็ม")