Update to C++-17
Updating to C++-17 allows us to use (list not complete): - **Structured bindings:** A proposal for de-structuring initialization, that would allow writing `auto [ x, y, z ] = expr;` where the type of `expr` was a tuple-like object, whose elements would be bound to the variables `x`, `y`, and `z` (which this construct declares). Tuple-like objects include `std::tuple`, `std::pair`, `std::array`, and aggregate structures. ```cpp using Coordinate = std::pair<int, int>; Coordinate origin() { return Coordinate{0, 0}; } const auto [ x, y ] = origin(); x; // == 0 y; // == 0 ``` ```cpp std::unordered_map<std::string, int> mapping { {"a", 1}, {"b", 2}, {"c", 3} }; // Destructure by reference. for (const auto& [key, value] : mapping) { // Do something with key and value } ``` - **std::optional:** The class template `std::optional` manages an optional contained value, i.e. a value that may or may not be present. A common use case for optional is the return value of a function that may fail. ```cpp std::optional<std::string> create(bool b) { if (b) { return "Godzilla"; } else { return {}; } } create(false).value_or("empty"); // == "empty" create(true).value(); // == "Godzilla" // optional-returning factory functions are usable as conditions of while and if if (auto str = create(true)) { // ... } ``` - **std::filesystem:** The new `std::filesystem` library provides a standard way to manipulate files, directories, and paths in a filesystem. Here, a big file is copied to a temporary path if there is available space: ```cpp const auto bigFilePath {"bigFileToCopy"}; if (std::filesystem::exists(bigFilePath)) { const auto bigFileSize {std::filesystem::file_size(bigFilePath)}; std::filesystem::path tmpPath {"/tmp"}; if (std::filesystem::space(tmpPath).available > bigFileSize) { std::filesystem::create_directory(tmpPath.append("example")); std::filesystem::copy_file(bigFilePath, tmpPath.append("newFile")); } } ```
issue