Exemplo 1:
Os arquivos de cabeçalho “opcional” e “iostream” são importados neste código. Devemos importar esses arquivos de cabeçalho para que possamos acessar facilmente as funções neles definidas. Depois disso, incluímos o “namespace std” para que não tenhamos que digitá-lo com funções separadamente como “std::optional” e “std::cout”. Usamos “namespace std” aqui. Então, agora colocamos o “opcional” ou “cout” sem digitar “std” com eles.
Então, invocamos main() e colocamos “optional” e definimos como “int” e declaramos “myNum”. É a sintaxe para declarar a variável “std::optional”. Em seguida, inicializamos outra variável chamada “valor” e atribuímos um valor à variável “myNum” utilizando a função value_or(). Passamos “99” nesta função, então ela atribui este “99” à variável “muNum” se não houver nenhum valor presente e o armazena na variável “valor”. Em seguida, colocamos “cout” abaixo dele, o que ajuda a exibir o valor que atribuímos à variável acima dele.
Código 1:
#incluir#include
usando namespace std ;
interno principal ( ) {
opcional < interno > meuNum ;
interno valor = meuNum. valor_ou ( 99 ) ;
corte << 'O valor de meuNum é:' << valor << fim ;
retornar 0 ;
}
Saída:
Aqui podemos notar que “99” é exibido o que significa que o valor não estava presente acima e o valor que adicionamos está atribuído a essa variável.
Exemplo 2:
Primeiro incluímos os arquivos de cabeçalho e colocamos o “namespace std”. Agora, abaixo disso, declaramos a função “std::optional” que é “divideFunc()”. O “dividendo” e o “divisor” são os dois parâmetros desta função. Em seguida, utilizamos “if” abaixo dele, onde adicionamos uma condição que diz “divisior! = 0”. Se isso for satisfeito, ele retorna a resposta desta divisão à medida que adicionamos “return” dentro dela. Caso contrário, ele retornará “nullopt”, o que significa que não há valor de tipo seguro. Agora, invocamos main(). Para inferir sobre “std::optional”, colocamos “divideFunc()” e adicionamos “27, 3” nele e atribuímos o resultado à variável “quociente”.
Aqui, utilizamos a palavra-chave “auto” para ajustar automaticamente seu tipo de dados. Depois disso, adicionamos o “if” onde utilizamos o “has-value” que determina se um valor de tipo é recebido. Em seguida, colocamos o “cout” que renderiza o resultado que está armazenado na variável “quociente”, e a parte “else” contém uma instrução que renderiza que o divisor é zero.
Código 2:
#include#incluir
usando namespace std ;
opcional < interno > dividirFunc ( interno dividendo , interno divisor ) {
se ( divisor != 0 ) {
retornar dividendo / divisor ;
}
retornar nulopt ;
}
interno principal ( ) {
auto quociente = dividirFunc ( 27 , 3 ) ;
se ( quociente. tem_valor ( ) ) {
corte << 'O quociente é:' << quociente. valor ( ) << fim ;
} outro {
corte << 'O Divisor é zero aqui' << fim ;
}
retornar 0 ;
}
Saída:
A saída renderiza o resultado após a divisão, o que significa que o divisor não é zero. Neste caso, “std::optional” é utilizado para determinar se um valor existe ou não com segurança de tipo.
Exemplo 3:
Aqui, estamos declarando a variável “std::optional” que é o “número” dentro de main(). Em seguida, utilizamos “if” no qual colocamos a função has_value() com esta variável “número”. Isto verifica se existe um valor ou não nesta variável “número”. Se a variável “número” contiver um valor, ela renderizará a instrução que adicionamos após “se”. Caso contrário, renderiza a instrução que colocamos depois de “else”.
Agora, inicializamos o “número” com “92” e utilizamos “if” novamente abaixo dele, onde a função has_value() é adicionada com a variável “número” no “if como condição”. Isso determina se a variável “número” tem ou não um valor. A frase que adicionamos depois de “if” é renderizada se a variável “número” tiver um valor. Caso contrário, a declaração que colocamos após “else” será renderizada.
Código 3:
#include#incluir
interno principal ( ) {
padrão :: opcional < interno > número ;
se ( número. tem_valor ( ) ) {
padrão :: corte << 'O número está presente:' << número. valor ( ) << padrão :: fim ;
} outro {
padrão :: corte << 'O número não está presente.' << padrão :: fim ;
}
número = 92 ;
se ( número. tem_valor ( ) ) {
padrão :: corte << 'O número está presente:' << número. valor ( ) << padrão :: fim ;
} outro {
padrão :: corte << 'O número não está presente.' << padrão :: fim ;
}
retornar 0 ;
}
Saída:
Isso renderiza a parte “else” primeiro porque não atribuímos nenhum valor à variável “std::optional”. Em seguida, atribuímos um valor a esta variável para exibi-lo na próxima linha.
Exemplo 4:
Agora, declaramos três variáveis “std::optional” que são “n1”, “n2” e “n3”. Também atribuímos os valores às variáveis “n2” e “n3” que são “29” e “45”, respectivamente. A variável “n1” da classe “std::optional” está vazia aqui. Agora, utilizamos o “boolalpha” que auxilia no retorno do retorno na forma “verdadeiro” ou “falso” em vez de “1” e “0”.
Depois disso, utilizamos os operadores relacionais entre essas variáveis “std::optional” e colocamos cada instrução dentro de “cout” para que também renderizasse o resultado da comparação que adicionamos. Primeiro, verifica se “n3 > n2”, depois “n3 < n2”, “n1 < n2”, “n1 == std::nullopt ”. Aqui, “nullopt” é utilizado para comparar o valor do tipo sem segurança ou nulo. Em seguida, verificamos “n2 == 49” e “n3 == 88” dentro da instrução “cout” separadamente.
Código 4:
#incluir#include
interno principal ( )
{
padrão :: opcional < interno > n1 ;
padrão :: opcional < interno > n2 ( 29 ) ;
padrão :: opcional < interno > n3 ( Quatro cinco ) ;
padrão :: corte << padrão :: alfanumérico ;
padrão :: corte << 'O n3 > n2' << ( n3 > n2 ) << padrão :: fim ;
padrão :: corte << 'O n3
padrão :: corte << 'O n1 < n2 ' << ( n1 < n2 ) << padrão :: fim ;
padrão :: corte << 'O n1 == nulo' << ( n1 == padrão :: nulopt ) << padrão :: fim ;
padrão :: corte << 'O n2 == 49' << ( n2 == 29 ) << padrão :: fim ;
padrão :: corte << 'O n3 == 88' << ( n3 == 88 ) << padrão :: fim ;
}
Saída:
O programa C++ mencionado anteriormente compara vários valores de variáveis do tipo “std::optional” enquanto imprime simultaneamente o resultado na saída.
Exemplo 5:
Os arquivos de cabeçalho incluídos neste código são “iostream”, “fstream”, “opcional” e “string”. O “fstream” contém a definição de ambas as funções “ofstream” e “ifstream” que precisamos neste código. Agora, incluímos o “namespace std”, para não o colocarmos separadamente com cada função. Em seguida, utilizamos “std:optional” e declaramos uma função com o nome “ReadFileFunc” na qual passamos “const string& f_Name” como argumento.
Depois, temos o “ifstream” que ajuda a ler o arquivo cujo nome será adicionado à variável “f_name”. Em seguida, utilizamos “if” no qual incluímos a condição que diz que se o arquivo não for aberto, ele retornará “nullopt” conforme o adicionamos abaixo da instrução “if”. Em seguida, criamos outra função que é “fileContent” que auxilia na gravação do conteúdo do arquivo se o arquivo for aberto. Aqui, colocamos novamente o “return fileContent” que também retorna o conteúdo que adicionamos ao arquivo após a abertura.
Agora, chamamos aqui “main()” em que inicializamos a variável “f_Name” com o nome do arquivo “Sample.txt” que queremos abrir. Então, chamamos aqui “ReadFileFunc()” e passamos a variável “f_Name” nesta função que tenta ler o arquivo e armazena seu conteúdo na variável “f_content”. Abaixo disso, utilizamos “has_value()” com a variável “f_content” em “if”. Se esta variável contém um valor, ela também o renderiza conforme adicionamos o “cout” abaixo de “if” no qual também colocamos o “f_content”. Caso contrário, mostra o erro que adicionamos depois de “else”.
Código 5:
#include#include
#incluir
#incluir
usando namespace std ;
opcional < corda > ReadFileFunc ( const corda & f_Nome ) {
ifstream meu arquivo ( f_Nome ) ;
se ( ! meu arquivo. está aberto ( ) ) {
retornar nulopt ;
}
string fileContent ( ( isstreambuf_iterator < Caracteres > ( meu arquivo ) ) , isstreambuf_iterator < Caracteres > ( ) ) ;
retornar arquivoConteúdo ;
}
interno principal ( ) {
const string f_Nome = 'Amostra.txt' ;
auto f_content = ReadFileFunc ( f_Nome ) ;
se ( f_content. tem_valor ( ) ) {
corte << 'O conteúdo do arquivo é: \n ' << f_content. valor ( ) << fim ;
} outro {
cerr << 'Erro: Arquivo não aberto aqui' << f_Nome << fim ;
}
retornar 0 ;
}
Saída:
Aqui, mostra a declaração de erro que adicionamos na parte “else” como o resultado do código fornecido.
Conclusão
Neste tutorial, exploramos o forte recurso C++ que é “std::optional” e explicamos que ele oferece um método padronizado de representação de valores opcionais, eliminando a necessidade de referências nulas e aumentando a clareza e a segurança do código. Aprendemos que isso também melhora a capacidade de explicar questões complicadas e lidar com erros com elegância.