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!