C++ 从int转换为enum
我已声明以下枚举:C++ 从int转换为enum,c++,C++,我已声明以下枚举: enum periods {one, five, ten, fifteen, thirty}; enum periods {one, five, ten, fifteen, thirty}; 现在我想在我的主函数中将它作为命令行参数传递 int main(int argc, char* argv[]) { periods mp; if (argc == 2) { std::string min_prd(argv[2]); mp=ato
enum periods {one, five, ten, fifteen, thirty};
enum periods {one, five, ten, fifteen, thirty};
现在我想在我的主函数中将它作为命令行参数传递
int main(int argc, char* argv[]) {
periods mp;
if (argc == 2) {
std::string min_prd(argv[2]);
mp=atoi(min_prd.c_str());
}
periods mp = atoi(argv[2]); // simplified for answer...
编译器抱怨:
error: invalid conversion from ‘int’ to ‘periods’
我之所以使用atoi(),是因为我认为enum是一个int-如何修复代码?您必须显式强制转换它:
mp=static_cast<periods>(atoi(min_prd.c_str()));
mp=static_cast(atoi(min_prd.c_str());
我声明了以下枚举:
enum periods {one, five, ten, fifteen, thirty};
enum periods {one, five, ten, fifteen, thirty};
现在我想在我的主函数中将它作为命令行参数传递
int main(int argc, char* argv[]) {
periods mp;
if (argc == 2) {
std::string min_prd(argv[2]);
mp=atoi(min_prd.c_str());
}
periods mp = atoi(argv[2]); // simplified for answer...
因此,有几个问题:
- 您需要将
返回的int强制转换为枚举类型<代码>静态转换(…)atoi
- 您应该意识到,argv[2]的“0”将映射到枚举标识符“1”,argv[2]的“1”将映射到“5”等。。。
- 如果您确实希望“1”映射到“1”、“5”映射到“5”等,最简单的方法是更改枚举:
enum periods{one=1,five=5,ten=10,十五=15,三十=30}代码>,但您的示例显然有点做作,因此无法猜测什么最适合您的实际需要
- 如果您确实希望“1”映射到“1”、“5”映射到“5”等,最简单的方法是更改枚举:
- 没有验证
periods to_periods(const std::string& s)
{
if (s == "one") return one;
if (s == "five") return five;
if (s == "ten") return ten;
if (s == "fifteen") return fifteen;
if (s == "thirty") return thirty;
throw std::runtime_error("invalid conversion from text to periods");
}
(在更多情况下,使用
std::map
或sortedstd::vector
跟踪这些关联并不少见,它允许可重用的算法和相同的数据支持从枚举数值到文本标识符的转换。)随机猜测,您真正想要的是:
periods mp;
if (argc < 2) {
mp=one; // default value
} else if (strcmp(argv[1], "one")==0) {
mp=one;
} else if (strcmp(argv[1], "five")==0) {
mp=five;
} else if (strcmp(argv[1], "ten")==0) {
mp=ten;
} else if (strcmp(argv[1], "fifteen")==0) {
mp=fifteen;
} else if (strcmp(argv[1], "thirty")==0) {
mp=thirty;
} else {
fprintf(stderr, "I can't possibly comprehend periods = '%s'\n", argv[1]);
return -1;
}
mp;
如果(argc<2){
mp=one;//默认值
}else if(strcmp(argv[1],“一”)==0){
mp=一个;
}else if(strcmp(argv[1],“五”)==0){
mp=5;
}else if(strcmp(argv[1],“十”)==0){
mp=10;
}else if(strcmp(argv[1],“十五”)==0){
mp=15;
}else if(strcmp(argv[1],“三十”)==0){
mp=30;
}否则{
fprintf(stderr,“我不可能理解句点=“%s”\n”,argv[1]);
返回-1;
}
简单的解决方案是使用静态\u cast
(另一个答案已经发布了):
现在这是一个更好的解决方案
但是,您可以使用另一种解决方案:
period mp;
if (argc == 2)
{
mp = to_period(argv[1]); //how should we implement it?
if (mp == period_end)
{
std::cout << "command line input error" << std::endl;
return 0;
}
}
period.h
的头文件,如下所示:
//period_items.h
E(one)
E(five)
E(ten)
E(fifteen)
E(thirty)
//period.h
#include <string>
enum period
{
#define E(item) item,
#include "period_items.h"
#undef E
period_end
};
period to_period(std::string const & name)
{
#define E(item) if(name == #item) return item;
#include "period_items.h"
#undef E
return period_end;
}
std::string to_string(period value)
{
#define E(item) if(value == item) return #item;
#include "period_items.h"
#undef E
return "<error>";
}
现在,你可以这样写:
#include "period.h"
period v = to_period(argv[1)); //string to period
std::string s = to_string(v); //period to string
希望这能有所帮助。请注意,这看起来像是等待发生的混乱<代码>一个==0,
五个
==1,十个
==2等等。所以静态演员(atoi(“1”)
=五个
,静态演员(atoi(“15”)
很可能是鼻魔。另外,如果argc
==2,那么argv[2]
NULL
argc
==2表示argv
数组中有两个元素,即argv[0]
和argv[1]
。标准行为是将argv[2]
设置为NULL
,作为到达参数向量末尾的冗余证据。这些是const char*
。使用==
进行比较会比较指针,而不是字符串值。此函数将始终引发异常。简单修复:将参数更改为std::string const&
。Ahhh。。。多好的一天:-谢谢你。