Những tính năng Boost nào trùng lặp với C ++ 11?


191

Tôi đã đặt các kỹ năng C ++ của mình lên kệ vài năm trước và dường như bây giờ, khi tôi cần chúng một lần nữa, phong cảnh đã thay đổi.

Hiện tại chúng tôi đã có C ++ 11 và sự hiểu biết của tôi là nó chồng lấp nhiều tính năng Boost.

Có một số tóm tắt về những sự trùng lặp đó nằm ở đâu, thư viện Boost nào sẽ trở thành di sản, khuyến nghị sử dụng các tính năng C ++ 11 nào thay vì các tính năng tăng cường và cái nào tốt hơn không?


4
Boost là một trong những người đầu tiên thực hiện thư viện TR1. Vì hiện tại đã có trong tiêu chuẩn, bạn nên thích phiên bản tiêu chuẩn. Boost.Lambda cũng được thay thế bằng lambdas thực tế bây giờ.
Kerrek SB

6
Các Wikipedia bài viết về C ++ 11 có một bản tóm tắt tốt của hầu hết các thay đổi.
Một số lập trình viên anh chàng

Câu trả lời:


285

Có thể thay thế bằng các tính năng hoặc thư viện ngôn ngữ C ++ 11

TR1 (chúng được đánh dấu trong tài liệu nếu đó là các thư viện TR1)

Các tính năng được chuyển ngược từ C ++ 11:

Có thể thay thế bằng các tính năng ngôn ngữ C ++ 17:

Nhóm tiêu chuẩn vẫn đang làm việc với nó:

Một phần lớn của MPL có thể được cắt bớt hoặc loại bỏ bằng cách sử dụng các mẫu hình biến đổi. Một số trường hợp sử dụng chung của dàn diễn viên từ vựng có thể được thay thế bằng std :: to_string và std :: sto X .

Một số thư viện Boost có liên quan đến C ++ 11 nhưng cũng có một số tiện ích mở rộng khác, ví dụ Boost.Feftal / Hash chứa hash_combine và các chức năng liên quan không có trong C ++ 11, Boost.Chrono có I / O và làm tròn và nhiều đồng hồ khác, vv vì vậy bạn vẫn có thể muốn xem xét các boost boost trước khi thực sự loại bỏ chúng.


1
Thêm vào danh sách Boost.Chrono , Boost.ExceptionBoost.Swap .
ildjarn

9
Lưu ý rằng Boost.Lambda (hay đúng hơn là Boost.Phoenix 'lambdas), vẫn hữu ích cho lambdas đa hình.
Xèo

2
Danh sách đẹp, mặc dù tôi không tin std::unique_ptrlà một phần của TR1 (vì nó yêu cầu ngữ nghĩa di chuyển)
Nemo

1
@ildjarn: Boost.Chrono cung cấp nhiều chức năng hơn <chrono>. Boost.Exception - chỉ N2179 có liên quan.
kennytm

2
@Nemo: Vâng. Chỉ std :: tr1 :: shared_ptr là một phần của TR1 và const std :: unique_ptr thay thế các trường hợp sử dụng boost :: scoped_ptr và boost :: scoped_array
kennytm

55

Trên thực tế, tôi không nghĩ rằng các thư viện boost sẽ trở thành di sản.

Vâng, bạn sẽ có thể sử dụng std::type_traits, regex, shared_ptr, unique_ptr, tuple<>, std::tie,std::begin thay vì Typetraits Boost / Utility, Tăng Smartpointer, Tăng tuple, Tăng thư viện Range, nhưng không nên trong thực tế không có nhu cầu thực sự để 'chuyển đổi' trừ khi bạn đang di chuyển hơn mã của bạn để c ++ 11.

Ngoài ra, theo kinh nghiệm của tôi, các stdphiên bản của hầu hết trong số này có phần ít tính năng hơn. Ví dụ: AFAICT tiêu chuẩn không

  • Biểu thức chính quy Perl5
  • cuộc gọi
  • Một số thành viên giao diện regex (như bool boost::basic_regex<>::empty() ) và sự khác biệt về giao diện
    • điều này cắn nhiều hơn vì giao diện Boost hoàn toàn khớp với Boost Xpressive
    • và nó chơi độc đáo hơn nhiều với Thuật toán chuỗi Boost Rõ ràng, cái sau không có bản sao chuẩn (chưa?)
  • Nhiều thứ liên quan đến TMP (Boost Fusion)
  • Lười biếng, biểu hiện lambdas dựa trên mẫu; chúng có những lợi ích không thể tránh khỏi ở chỗ chúng có thể là đa hình ngày nay , trái ngược với C ++ 11. Do đó, họ thường có thể cô đọng hơn:

     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);

    Chắc chắn nhất, điều này vẫn có một số hấp dẫn so với C ++ 11 lambdas (với các kiểu trả về theo sau, các tham số khai báo và khai báo rõ ràng).

Ngoài ra, có một vai trò LỚN cho Boost, chính xác là tạo điều kiện cho việc di chuyển theo đường dẫn từ C ++ 03 sang C ++ 11 và tích hợp các cơ sở mã C ++ 11 và C ++ 03. Tôi đặc biệt nghĩ về

  • Tăng cường tự động (BOOST_AUTO)
  • Tăng tiện ích ( boost::result_of<>và liên quan)
  • Tăng cường thuyết minh (BOOST_FOREACH)
  • Đừng quên: Boost Move - cho phép viết các lớp với ngữ nghĩa di chuyển với cú pháp sẽ biên dịch tốt như nhau trên trình biên dịch C ++ 03 với trình biên dịch Boost 1_48 + và C ++ 11.

Chỉ 0,02 đô la của tôi

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.