C++17: Initializers for if & switch statements
Two small, but very useful C++17 features are initializers for if and switch statements. These can be used to prevent polluting the enclosing scope with variables that should only be scoped to the if and switch statement. The for statement already supports such initializers since the beginning.
For example, suppose you are using a map to store the number of times a certain name occurs:
#include <cstddef> #include <map> #include <string> #include <iostream> int main() { std::map<std::string, size_t> nameCounters{ {"Marc", 5}, {"Bob", 12}, {"John", 3} }; auto result = nameCounters.find("Bob"); if (result != cend(nameCounters)) std::cout << "Count: " << result->second << std::endl; }
In this example I’m searching for a key in the map, and if the key is found, I output the associated value to the console. The result of calling find() is stored in result, but this variable is only used inside the if statement.
With C++17, you can initialize the result variable with an if statement initializer so that the result variable is only known inside the if statement and does not pollute the enclosing scope with unnecessary variables:
#include <cstddef> #include <map> #include <string> #include <iostream> int main() { // ... Initialize map as before ... if (auto result = nameCounters.find("Bob"); result != cend(nameCounters)) std::cout << "Count: " << result->second << std::endl; }
Similar kind of initializers are supported for switch statements:
switch (<initializer>; <expression>) { /* ... */ }