CPP

C++17 and C++20 Features - What's New


C++17 and C++20 introduced several new features and improvements to the C++ programming language. These features enhance the expressiveness and power of C++, making it a more modern and developer-friendly language. In this guide, we'll explore some of the key features introduced in C++17 and C++20, along with explanations and sample code.

1. Features Introduced in C++17

C++17 introduced a variety of language and library features, including the following:

1.1. Structured Bindings

Structured bindings allow you to decompose tuples, arrays, and other data structures into individual variables, making it easier to work with structured data. Here's an example:

#include <iostream>
#include <tuple>
int main() {
    std::tuple<int, std::string> person{30, `John`};
    auto [age, name] = person;
    std::cout << `Name: ` << name << `, Age: ` << age << std::endl;
    return 0;
}
    

1.2. if constexpr

`if constexpr` is a new control structure that allows you to conditionally compile code based on compile-time conditions. It's particularly useful for enabling or disabling code based on template arguments. Here's an example:

#include <iostream>
template <typename T>
void processValue(const T& value) {
    if constexpr (std::is_integral<T>::value) {
        std::cout << `Integral value: ` << value << std::endl;
    } else {
        std::cout << `Non-Integral value` << std::endl;
    }
}
int main() {
    processValue(42); // Integral value
    processValue(`Hello`); // Non-Integral value
    return 0;
}
    

2. Features Introduced in C++20

C++20 brought numerous enhancements to the language, including the following:

2.1. Concepts

Concepts allow you to define constraints on template parameters, making template code more expressive and error messages more understandable. Here's an example:

#include <iostream>
template <typename T>
concept Integral = std::is_integral<T>::value;
template <Integral T>
T add(T a, T b) {
    return a + b;
}
int main() {
    std::cout << add(5, 7) << std::endl;
    // This will not compile because `Hello` is not integral.
    // std::cout << add(`Hello`, `World`) << std::endl;
    return 0;
}
    

2.2. Ranges

The ranges library introduces new algorithms and range adaptors for working with sequences of elements. It simplifies code and improves readability. Here's an example:

#include <iostream>
#include <vector>
#include <algorithm>>
#include <ranges>
int main() {
    std::vector<int> numbers = {1, 2, 3, 4, 5};
    // Use ranges to filter and transform elements
    auto result = numbers | std::views::filter([](int n) { return n % 2 == 0; })
                          | std::views::transform([](int n) { return n * 2; });
    for (int num : result) {
        std::cout << num << ` `;
    }
    return 0;
}
    

3. Conclusion

C++17 and C++20 introduced significant improvements to the C++ language, enhancing its expressiveness, readability, and usability. By taking advantage of these new features, C++ developers can write more modern and efficient code.

Written by Surfside Media

Senior Full Stack Developer specializing in Web Technologies.