Algumas vezes, desejamos escrever funções que não retornam, necessariamente, um resultado. Nesses casos, podemos usar o contêiner
std::optional. Trata-se de uma alternativa boa para valores mágicos e exceções.
#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;
}
}
Esta abordagem torna o código mais claro, expressando claramente a intenção. Não acha?