Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C++

Các tính năng mới của C++17

Tiêu chuẩn C++ cập nhật mỗi 3 năm. C++17 mang lại nhiều tính năng làm code gọn, sạch, an toàn hơn. Dưới đây là các tính năng nổi bật:

1. Fold Expressions (Biểu thức gấp)

Cho phép xử lý pack tham số biến đổi (variadic template) ngắn gọn.

  • Unary right fold: (pack op ...)
  • Unary left fold: (... op pack)
  • Binary left fold: (init op ... op pack)
  • Binary right fold: (pack op ... op init)

pack là parameter pack, op là toán tử (+, -, *, /, <=, ...), init là giá trị khởi tạo.

template<typename ...Args>
auto addition(Args ...args) {
    return (args + ... + 0); // Binary left fold
}
template<typename ...Args>
auto sum2(Args ...args) {
    return (args + ...); // Unary right fold
}
int main() {
    cout << "Sum: " << addition(1,1,1,1,1) << endl; // 5
    cout << "Sum2: " << sum2(1,2,3) << endl; // 6
}

2. Structured Bindings (Ràng buộc cấu trúc)

Khởi tạo nhiều biến từ tuple, pair, struct, array trong 1 câu lệnh.

  • Mảng: int a[3]={3,4,5}; auto [x,y,z]=a; → x=3,y=4,z=5.
  • Tuple-like: auto& [p,q,r] = tuple; ràng buộc reference.
  • Data members: const auto [a,b] = func(); với struct có bit-field, volatile.

3. Khởi tạo enum bằng danh sách trực tiếp

enum byte : unsigned char {}; 
byte b0 {0};      // OK
byte b1 = byte{1}; // OK
byte b2 = byte{256}; // ERROR (0-255)

4. Khai báo biến trong if/switch

if (auto it = map.find(key); it != map.end()) { ... }
switch (auto x = getValue(); x) { ... }

Biến chỉ tồn tại trong scope của if/switch.

5. if constexpr (Đánh giá tại compile-time)

Dùng trong template để loại bỏ nhánh không dùng ở compile-time.

template <typename T>
auto length(T const& value) {
    if constexpr (is_integral_v<T>) return value;
    else return value.length();
}

6. Nested Namespaces (Namespace lồng nhau đơn giản)

// C++17
namespace Earth::Continent::Country {
    class City { ... };
}

Thay cho cú pháp cũ lồng nhiều cấp namespace A { namespace B { ... } }.