你需要的是一張桌子。因爲枚舉是線性的, 串的一個簡單的表就足夠了:
char const* const stateNames[] =
{
// In the same order as in the enum.
"NY",
"FL",
// ...
};
然後:
char const* const* entry
= std::find(std::begin(stateNames), std::end(stateNames), userInput);
if (entry == std::end(stateNames)) {
// Illegal input...
} else {
State value = static_cast<State>(entry - std::begin(stateNames));
或者,也可以具有的數組:
struct StateMapping
{
State enumValue;
char const* name;
struct OrderByName
{
bool operator()(StateMapping const& lhs, StateMapping const& rhs) const
{
return std::strcmp(lhs.name, rhs. name) < 0;
}
bool operator()(StateMapping const& lhs, std::string const& rhs) const
{
return lhs.name < rhs;
}
bool operator()(std::string const& lhs, StateMapping const& rhs) const
{
return lhs < rhs.name;
}
};
};
StateMapping const states[] =
{
{ NY, "NY" },
// ...
};
排序鑰匙,並用std::lower_bound
:
StateMapping::OrderByName cmp;
StateMapping entry =
std::lower_bound(std::begin(states), std::end(states), userInput, cmp);
if (entry == std::end(states) || cmp(userInput, *entry) {
// Illegal input...
} else {
State value = entry->enumValue;
// ...
}
後者可能稍微快一點,但只有五十個 條目,我懷疑你會注意到不同之處。
當然,您不要手動編寫此代碼;你用一個簡單的腳本生成 。(過去,我有代碼,它會解析枚舉定義的C++源代碼,並從它們中生成 映射功能。它比聽起來簡單 ,因爲除了 之外,您可以忽略大量的C++代碼。用於跟蹤各個嵌套的)
請添加MCVE顯示你嘗試過什麼。 – Chantola 2014-09-24 17:32:57