C++ Std::Opcional

C Std Opcional



O recurso “std::optional” é fornecido em C++17. O “std::optional” permite uma representação segura de valores opcionais ou uma escolha de ter um valor. Uma classe de modelo chamada “std::optional” contém um valor opcional que pode ou não conter um valor válido. É um substituto mais seguro para representar valores vazios ou opcionais do que ponteiros brutos ou outras técnicas. O “std::optional” minimiza a possibilidade de erros de desreferência de ponteiro nulo, exigindo que o usuário verifique explicitamente se um valor existe antes de recuperá-lo.

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 << ( n3 < n2 ) << padrão :: fim ;

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.