如何在 C++ 中把枚举型转换为字符串
本文将解释几种在 C++ 中把枚举类型转换为 string
变量的方法。
使用 const char*
数组将枚举类型转换为字符串
枚举 enum
是一个内置类型,可用于声明通常以数组形式形成的较小的命名整数。这种机制提供了一种不易出错和更易读的方式来表示一组整数值。
枚举元素可以有一个位置值(如我们的示例代码中 Banana
有 0
),也可以有一个显式值(声明为 enum Fruit { Banana = 34, ...}
)。
这个例子展示了如何利用枚举元素的隐式值从数组中访问相应的字符串值。注意,我们在 main
函数的开头用 1-4 范围内的值初始化随机 input
变量,以更好地展示现实中真实的场景。
#include <iostream>
#include <string>
#include <chrono>
using std::cout; using std::cin;
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;
}
输出:
Banana Pie
使用自定义函数将一个枚举转换为一个字符串
或者,我们也可以定义自己的函数,它接受一个整数作为参数并返回一个字符串值。字符串变量是用函数内部的 enum_str
数组中的 const char*
值初始化的。如果你把 Total
值作为参数传给 getStringForEnum
函数,它将返回一些垃圾值,因为 enum_str
数组只有 4 个元素。
#include <iostream>
#include <string>
#include <chrono>
using std::cout; using std::cin;
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;
}
输出:
Banana Pie
在上述枚举类型中加入 Total
元素可以有实际的用途。首先,它代表了枚举中可以作为循环参数利用的元素数量,如下例代码所示。第一个循环从 enum_str
数组中提取每个字符串,并将它们推送到 enum_strigs
向量变量中。第二次迭代将 enum_strigs
的内容打印出来到控制台。
#include <iostream>
#include <string>
#include <chrono>
#include <vector>
using std::cout; using std::cin;
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;
}
输出:
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