Como converter o Enum em String em C++
-
Utilize
const char*
Array para converter um Enum para uma String em C++ - Use a função definida pelo usuário para converter um Enum em uma string
Este artigo explicará vários métodos de conversão de um tipo de enumeração para uma variável string
em C++.
Utilize const char*
Array para converter um Enum para uma String em C++
O enum
é um tipo embutido, que pode ser utilizado para declarar pequenos inteiros nomeados geralmente formados como uma array. Este mecanismo fornece uma forma menos sujeita a erros e mais legível de representar um array de valores inteiros.
Os elementos de enumeração podem ter um valor posicional ( como Banana
tem 0
em nosso código de exemplo ), ou pode ter um valor explícito (declarado como enum Fruit { Banana = 34, ...}
).
Este exemplo mostra como valores implícitos de elementos enum
podem ser utilizados para acessar valores de string correspondentes a partir de um array. Observe que inicializamos a variável aleatória input
com o valor de 1-4 no início da função main
para demonstrar melhor o cenário do mundo real.
#include <chrono>
#include <iostream>
#include <string>
using std::cin;
using std::cout;
using std::endl;
using std::string;
enum Fruit { Banana, Coconut, Mango, Carambola, Total };
static const char *enum_str[] = {"Banana Pie", "Coconut Tart", "Mango Cookie",
"Carambola Crumble"};
int main() {
std::srand(std::time(nullptr));
int random = rand() % Total;
auto input = static_cast<Fruit>(random);
switch (input) {
case Banana:
cout << enum_str[Banana] << endl;
break;
case Coconut:
cout << enum_str[Coconut] << endl;
break;
case Mango:
cout << enum_str[Mango] << endl;
break;
case Carambola:
cout << enum_str[Carambola] << endl;
break;
case Total:
cout << "Incorrect ingredient!" << endl;
break;
}
return EXIT_SUCCESS;
}
Saída (*random
):
Banana Pie
Use a função definida pelo usuário para converter um Enum em uma string
Alternativamente, podemos definir nossa própria função, que toma um número inteiro como parâmetro e retorna um valor de string. A variável string é inicializada com um valor const char*
da array enum_str
dentro da função. Se você passar o valor Total
como argumento para a função getStringForEnum
, ele retornará algum valor de lixo, já que a array enum_str
tem apenas 4 elementos.
#include <chrono>
#include <iostream>
#include <string>
using std::cin;
using std::cout;
using std::endl;
using std::string;
enum Fruit { Banana, Coconut, Mango, Carambola, Total };
static const char *enum_str[] = {"Banana Pie", "Coconut Tart", "Mango Cookie",
"Carambola Crumble"};
string getStringForEnum(int enum_val) {
string tmp(enum_str[enum_val]);
return tmp;
}
int main() {
string todays_dish = getStringForEnum(Banana);
cout << todays_dish << endl;
return EXIT_SUCCESS;
}
Resultado:
Banana Pie
A inclusão do elemento Total
no tipo enum
acima pode ter uma utilização prática. Por um lado, ela representa o número de elementos na enumeração que podem ser utilizados como parâmetro de loop, como mostrado no seguinte código de exemplo. O primeiro loop extrai cada string do array enum_str
e as empurra para a variável vetorial enum_strigs
. A segunda iteração imprime o conteúdo de enum_strigs
para o console.
#include <chrono>
#include <iostream>
#include <string>
#include <vector>
using std::cin;
using std::cout;
using std::endl;
using std::string;
using std::vector;
enum Fruit { Banana, Coconut, Mango, Carambola, Total };
static const char *enum_str[] = {"Banana Pie", "Coconut Tart", "Mango Cookie",
"Carambola Crumble"};
string getStringForEnum(int enum_val) {
string tmp(enum_str[enum_val]);
return tmp;
}
int main() {
vector<string> enum_strigs{};
enum_strigs.reserve(Total);
for (int i = 0; i < Total; ++i) {
enum_strigs.push_back(getStringForEnum(i));
}
for (const auto &item : enum_strigs) {
cout << item << endl;
}
return EXIT_SUCCESS;
}
Resultado:
Banana Pie
Coconut Tart
Mango Cookie
Carambola Crumble
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
LinkedIn Facebook