Sometimes we want to write functions that may not always return a result. In these cases we can use the std::optional container. That’s a pretty good alternative to special magic values and exceptions.
#include <optional>
#include <string>
#include <sstream>
#include <iostream>
std::optional<int> TryParseInt(std::string input)
{
std::stringstream parser(input);
int result;
parser >> result;
if (parser.fail() || !parser.eof())
return {};
return result;
}
int main()
{
std::cout << "nEnter a number: " << std::endl;
std::string input;
std::cin >> input;
auto parseResult = TryParseInt(input);
if (parseResult.has_value())
{
for (auto i = 0; i < parseResult; i ++)
{
std::cout << i << std::endl;
}
}
else
{
std::cout << "Invalid number!" << std::endl;
}
}
This approach make the code more readable, as the intent is expressed explicitly. Dont’t you think?