Como usar o std::optional em C++ Moderno

🗞️ É útil para situações em que você quer indicar a ausência de um valor de uma forma mais clara e segura do que usar ponteiros nulos.


Como usar o std::optional em C++ Moderno


std::optional é uma funcionalidade introduzida na biblioteca padrão do C++17 que encapsula um valor opcional, ou seja, um valor que pode ou não estar presente.

É útil para situações em que você quer indicar a ausência de um valor de uma forma mais clara e segura do que usar ponteiros nulos ou valores especiais.

Vamos ver alguns exemplos de uso!


01. Criação e uso básico

#include <iostream>
#include <optional>

std::optional<int> find_even_number(int num) {
    if (num % 2 == 0) {
        return num;
    } else {
        return std::nullopt; // Indica ausência de valor
    }
}

int main() {
    int num = 4;
    auto result = find_even_number(num);
    
    if (result) {
        std::cout << "Número par encontrado: " << result.value() << '\n';
    } else {
        std::cout << "Número não é par.\n";
    }
    
    return 0;
}


02. Usando std::optional com std::string

#include <iostream>
#include <optional>

std::optional<std::string> get_middle_name(const std::string& full_name) {
    size_t space1 = full_name.find(' ');
    if (space1 == std::string::npos) {
        return std::nullopt;
    }
    size_t space2 = full_name.find(' ', space1 + 1);
    if (space2 == std::string::npos) {
        return std::nullopt;
    }
    return full_name.substr(space1 + 1, space2 - space1 - 1);
}

int main() {
    std::string name = "Marcos Simões Oliveira";
    auto middle_name = get_middle_name(name);
    
    if (middle_name) {
        std::cout << "Nome do meio: " << *middle_name << '\n';
    } else {
        std::cout << "O nome do meio não foi encontrado.\n";
    }
    
    return 0;
}

03. Manipulando std::optional

#include <iostream>
#include <optional>

int main() {
    std::optional<int> opt;

    // Atribuindo um valor
    opt = 42;
    std::cout << "Valor: " << *opt << '\n';

    // Removendo o valor
    opt.reset();
    if (!opt) {
        std::cout << "Sem valor.\n";
    }

    // Usando valor padrão
    std::cout << "Valor ou padrão: " << opt.value_or(-1) << '\n';

    return 0;
}

04. Trabalhando com funções que retornam std::optional

#include <iostream>
#include <optional>

std::optional<std::string> get_first_word(const std::string& sentence) {
    size_t pos = sentence.find(' ');
    if (pos == std::string::npos) {
        return std::nullopt;
    }
    return sentence.substr(0, pos);
}

int main() {
    std::string sentence = "Olá, Mundo!";
    auto first_word = get_first_word(sentence);
    
    if (first_word) {
        std::cout << "Primeira palavra: " << *first_word << '\n';
    } else {
        std::cout << "A primeira palavra não foi encontrada.\n"; 
    }
    
    return 0;
}

Em resumo, std::optional é uma maneira elegante e segura de lidar com valores opcionais em C++, fornecendo uma alternativa mais clara e menos propensa a erros em comparação com o uso de ponteiros nulos ou valores especiais.



cpp cppdaily


Compartilhe


Nosso canal no Youtube

Inscreva-se


Marcos Oliveira

Marcos Oliveira

Desenvolvedor de software
https://github.com/terroo


Crie Aplicativos Gráficos para Linux e Windows com C++

Aprenda C++ Moderno e crie Games, Programas CLI, GUI e TUI de forma fácil.

Saiba Mais

Receba as novidades no seu e-mail!

Após cadastro e confirmação do e-mail, enviaremos semanalmente resumos e também sempre que houver novidades por aqui para que você mantenha-se atualizado!