直接的解决方案是使用static_cast
(因为其他答案已经发布):
periods mp;
if (argc == 2)
{
std::string min_prd(argv[1]); //the index should be 1
mp = static_cast<periods>(atoi(min_prd.c_str()));
}
但是 then不atoi
应该用于将 c-string 转换为 int,因为不检查输入字符串中的错误,因此它是unsafe。atoi
C++11 提供了更安全的转换函数,因此您可以std::stoi
用作:
try
{
periods mp;
if (argc == 2)
{
//std::stoi could throw exception on error in input
mp = static_cast<periods>(std::stoi(argv[1]));
}
//use mp here
}
catch(std::exception const & e)
{
std::cout << "exception caught with message : " << e.what() << std::endl;
}
现在这是一个更好的解决方案。
但是,您可以使用另一种解决方案:
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;
}
}
现在的问题是,我们应该如何实现to_period
函数?
请注意,此解决方案假定枚举值的命令行参数one
将是其字符串表示形式,即它将是整数表示形式,"one"
而不是1
整数表示形式。
我会将此解决方案实施为:
首先创建一个名为的头文件period_items.h
:
//period_items.h
E(one)
E(five)
E(ten)
E(fifteen)
E(thirty)
然后创建另一个名为period.h
的头文件:
//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;
}
现在您可以简单地包含period.h
和使用to_period
函数。:-)
请注意,在替代解决方案中,我使用了单数形式而不是复数形式,这意味着我使用period
了而不是periods
. 我觉得period
合适。
您还可以将此功能添加到period.h
:
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
希望有帮助。