簡単な解決策は、使用することです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()));
}
ただし、入力文字列のエラーをチェックしないため、 c-string を int に変換するために使用しないatoi
でください。したがって、安全ではありません。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
それが役立つことを願っています。