3 回答

TA貢獻1827條經驗 獲得超8個贊
如果您希望枚舉將自己命名為字符串,請參見這篇文章。否則,a std::map<MyEnum, char const*>會很好地工作。(將字符串文字復制到映射中的std :: strings沒有意義)
對于額外的語法糖,這是編寫map_init類的方法。目標是允許
std::map<MyEnum, const char*> MyMap;
map_init(MyMap)
(eValue1, "A")
(eValue2, "B")
(eValue3, "C")
;
該函數template <typename T> map_init(T&)返回一個map_init_helper<T>。 map_init_helper<T>存儲一個T&,并定義瑣碎的map_init_helper& operator()(typename T::key_type const&, typename T::value_type const&)。(返回*this從operator()允許的鏈接operator(),像operator<<上std::ostreamS)
template<typename T> struct map_init_helper
{
T& data;
map_init_helper(T& d) : data(d) {}
map_init_helper& operator() (typename T::key_type const& key, typename T::mapped_type const& value)
{
data[key] = value;
return *this;
}
};
template<typename T> map_init_helper<T> map_init(T& item)
{
return map_init_helper<T>(item);
}
由于函數和幫助程序類是模板化的,因此可以將它們用于任何地圖或類似地圖的結構。即它也可以添加條目到std::unordered_map
如果您不喜歡編寫這些幫助器,則boost :: assign提供了相同的功能。

TA貢獻2051條經驗 獲得超10個贊
自動從另一表格中生成一種表格。
資源:
enum {
VALUE1, /* value 1 */
VALUE2, /* value 2 */
};
產生:
const char* enum2str[] = {
"value 1", /* VALUE1 */
"value 2", /* VALUE2 */
};
如果枚舉值很大,則生成的表單可以使用unordered_map <>或康斯坦丁建議的模板。
資源:
enum State{
state0 = 0, /* state 0 */
state1 = 1, /* state 1 */
state2 = 2, /* state 2 */
state3 = 4, /* state 3 */
state16 = 0x10000, /* state 16 */
};
產生:
template <State n> struct enum2str { static const char * const value; };
template <State n> const char * const enum2str<n>::value = "error";
template <> struct enum2str<state0> { static const char * const value; };
const char * const enum2str<state0>::value = "state 0";
例:
#include <iostream>
int main()
{
std::cout << enum2str<state16>::value << std::endl;
return 0;
}
- 3 回答
- 0 關注
- 1036 瀏覽
添加回答
舉報