ฟีเจอร์ Boost ใดที่ทับซ้อนกับ C ++ 11


192

ฉันใส่ทักษะ C ++ ของฉันบนชั้นวางเมื่อหลายปีก่อนและดูเหมือนตอนนี้เมื่อฉันต้องการมันอีกครั้งภูมิทัศน์ก็เปลี่ยนไป

ตอนนี้เรามี C ++ 11 และความเข้าใจของฉันคือมันทับซ้อนกับฟีเจอร์ Boost มากมาย

มีข้อสรุปบางอย่างที่ทับซ้อนกันอยู่ซึ่ง Boost ห้องสมุดใดที่จะกลายเป็นมรดกแนะนำว่าคุณสมบัติ C ++ 11 ที่จะใช้แทนการเพิ่มและที่ไม่ดีกว่า?


4
Boost เป็นหนึ่งในคนแรกที่ใช้ไลบรารี TR1 เนื่องจากตอนนี้อยู่ในมาตรฐานคุณควรเลือกรุ่นมาตรฐาน Boost.Lambda ก็ถูกแทนที่ด้วย lambdas จริง ๆ ในตอนนี้
Kerrek SB

6
วิกิพีเดียบทความเกี่ยวกับ C ++ 11 มีสรุปที่ดีที่สุดของการเปลี่ยนแปลง
โปรแกรมเมอร์บางคนเพื่อน

คำตอบ:


286

สามารถแทนที่ได้ด้วยคุณลักษณะหรือไลบรารีภาษา C ++ 11

TR1 (ถูกทำเครื่องหมายไว้ในเอกสารประกอบหากเป็นไลบรารี TR1)

คุณสมบัติแบ็คพอร์ตจาก C ++ 11:

สามารถเปลี่ยนได้โดยใช้คุณสมบัติภาษา C ++ 17:

ทีมมาตรฐานยังคงทำงานอยู่:

ส่วนใหญ่ของMPLสามารถตัดหรือลบออกได้โดยใช้เทมเพลตแบบแปรผัน บางกรณีการใช้งานทั่วไปของการโยนคำศัพท์จะถูกแทนที่ด้วยมาตรฐาน :: to_string และมาตรฐาน :: STO X

ไลบรารี Boost บางตัวเกี่ยวข้องกับ C ++ 11 แต่ยังมีนามสกุลเพิ่มเติมเช่นBoost.Functional / Hashมีhash_combineและฟังก์ชันที่เกี่ยวข้องที่ไม่พบใน C ++ 11, Boost.Chronoมี I / O และการปัดเศษและนาฬิกาอื่น ๆ อีกมากมาย เป็นต้นดังนั้นคุณอาจต้องการดูที่เพิ่มก่อนที่จะยกเลิกพวกเขาจริงๆ


1
เพิ่มในรายการBoost.Chrono , Boost.ExceptionและBoost.Swap
ildjarn

9
โปรดทราบว่า Boost.Lambda (หรือมากกว่านั้นคือ lambdas ของ Boost.Phoenix) ยังคงมีประโยชน์สำหรับ lambdas polymorphic
Xeo

2
รายการที่ดี แต่ผมไม่เชื่อว่าstd::unique_ptrเป็นส่วนหนึ่งของ TR1 (เพราะมันต้องมีความหมายย้าย)
Nemo

1
@ildjarn: Boost.Chrono มีฟังก์ชั่นให้มากกว่า <chrono> Boost.Exception - เฉพาะ N2179 เท่านั้นที่เกี่ยวข้อง
kennytm

2
@Nemo: ใช่ เฉพาะ std :: tr1 :: shared_ptr เป็นส่วนหนึ่งของ TR1 และ const std :: unique_ptr แทนที่กรณีการใช้งานของ boost :: scoped_ptr และ boost :: scoped_array
kennytm

56

อันที่จริงฉันไม่คิดว่าห้องสมุดเพิ่มกำลังจะกลายเป็นมรดก

ใช่คุณควรจะสามารถที่จะใช้std::type_traits, regex, shared_ptr, unique_ptr, tuple<>, std::tie, std::beginแทน Typetraits Boost / ยูทิลิตี้เพิ่ม Smartpointer, เพิ่ม Tuple, เพิ่มห้องสมุดช่วง แต่มีในทางปฏิบัติควรจะไม่จริงต้อง 'สวิทช์' ยกเว้นกรณีที่คุณกำลังจะย้ายมากขึ้นของ รหัสของคุณถึง c ++ 11

นอกจากนี้จากประสบการณ์ของฉันstdเวอร์ชันเหล่านี้ส่วนใหญ่มีคุณสมบัติที่ค่อนข้างด้อยกว่า เช่น AFAICT มาตรฐานไม่ได้มี

  • การแสดงออกปกติ Perl5
  • call_traits
  • สมาชิกอินเตอร์เฟส regex บางตัว (เช่นbool boost::basic_regex<>::empty()) และความแตกต่างของอินเตอร์เฟสอื่น ๆ
    • สิ่งนี้จะกัดมากขึ้นเนื่องจากส่วนต่อประสาน Boost ตรงกับ Boost Xpressive
    • และมันเล่นได้ดีมากขึ้นด้วย Boost String Algorithms เห็นได้ชัดว่าหลังไม่มีมาตรฐาน (หรือยัง)
  • มีหลายสิ่งที่เกี่ยวข้องกับ TMP (Boost Fusion)
  • ขี้เกียจแลมบ์ดาตามแม่แบบนิพจน์ พวกเขามีผลประโยชน์ที่หลีกเลี่ยงไม่ได้ที่พวกเขา สามารถเป็นโพลีมอร์ฟิคได้ในปัจจุบันซึ่งต่างจาก C ++ 11 ดังนั้นพวกเขามักจะรวบรัดมากขึ้น:

     std::vector<int> v = {1,2,-9,3};
    
     for (auto i : v | filtered(_arg1 >=0))
         std::cout << i << "\n";
    
     // or:
     boost::for_each(v, std::cout << _arg1);
    

    แน่นอนที่สุดสิ่งนี้ยังคงมีการดึงดูดมากกว่า lambdas C ++ 11 (ด้วยประเภทการส่งคืนการจับและพารามิเตอร์ที่ประกาศอย่างชัดเจน)

นอกจากนี้ยังมีบทบาทที่ยิ่งใหญ่สำหรับ Boost ซึ่งช่วยอำนวยความสะดวกในการโยกย้ายเส้นทางที่ชาญฉลาดจาก C ++ 03 ถึง C ++ 11 และผสานรวมโค้ด C ++ 11 และ C ++ 03 ฉันกำลังคิดถึง

  • เพิ่มอัตโนมัติ (BOOST_AUTO)
  • Boost Utility ( boost::result_of<>และที่เกี่ยวข้อง)
  • เพิ่ม Foreach (BOOST_FOREACH)
  • อย่าลืม: Boost Move - ซึ่งทำให้สามารถเขียนคลาสที่มีซีแมนทิกส์ move ด้วยไวยากรณ์ที่สามารถคอมไพล์ได้ดีเท่ากันในคอมไพเลอร์ C ++ 03 พร้อมคอมไพเลอร์ Boost 1_48 + และ C ++ 11

แค่ $ 0.02 ของฉัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.