64,646
社区成员
发帖
与我相关
我的任务
分享
#include <array>
#include <bitset>
#include <initializer_list>
#include <utility>
template <typename TEnum, typename TValue, int enumerators = TEnum::ENUMERATORS>
class EnumMap {
public:
EnumMap() = default;
~EnumMap() = default;
EnumMap(const EnumMap&) = delete;
EnumMap& operator=(const EnumMap&) = delete;
EnumMap(std::initializer_list<std::pair<TEnum, TValue>> init_list) {
for (const std::pair<TEnum, TValue>& p : init_list) {
array_[p.first] = p.second;
}
}
bool empty() const { return flags_.none(); }
size_t size() const { return flags_.count(); }
TValue& operator[](size_t i) { flags_.set(i); return array_[i]; }
private:
std::array<TValue, enumerators> array_;
std::bitset<enumerators> flags_;
};
template <typename Key, typename Value>
using unordered_map = std::unordered_map < typename std::underlying_type<Key>::type, Value >;
那就只能升级编译器了。
很不幸,就我所知,让 std::hash 支持所有枚举类型需要对标准库本身动手术。如果你手头的标准库不支持,没有非侵入式的扩展能够简单易行的提供通用支持。
template <typename Key, typename Value>
using unordered_map = std::unordered_map < typename std::underlying_type<Key>::type, Value >;
那就只能升级编译器了。
很不幸,就我所知,让 std::hash 支持所有枚举类型需要对标准库本身动手术。如果你手头的标准库不支持,没有非侵入式的扩展能够简单易行的提供通用支持。[/quote]
#include<iostream>
#include<string>
#include<unordered_map>
#include<functional>
enum class test_enum
{
e1,
e2,
e3,
};
template<typename T>
struct myhash
{
size_t operator () (T e)const {return static_cast<size_t>(e);}
};
template<typename T1, typename T2>
using EnumMap = std::unordered_map<T1, T2, myhash<T1>>;
int main()
{
EnumMap<test_enum, std::string> m = {
{test_enum::e1, "f1"},
{test_enum::e2, "f2"},
{test_enum::e3, "f3"},
};
for (const auto& p : m)
std::cout<<static_cast<int>(p.first)<<": "<<p.second<<std::endl;
return 0;
}
#include <initializer_list>
#include <iostream>
#include <string>
#include <unordered_map>
enum a_enum
{
test0,
test1,
test2,
test3,
};
namespace std
{
template <>
struct hash <a_enum>
{
size_t operator () (a_enum const e) const
{
return e;
}
};
}
int main ()
{
std::unordered_map<a_enum,std::string> const map
{
{test0,"test0"},
{test1,"test1"},
{test2,"test2"},
{test3,"test3"},
};
for (auto const& pair : map)
{
std::cout << pair.first << " : " << pair.second << std::endl;
}
}
[/quote]
#include <initializer_list>
#include <iostream>
#include <string>
#include <unordered_map>
enum a_enum
{
test0,
test1,
test2,
test3,
};
namespace std
{
template <>
struct hash <a_enum>
{
size_t operator () (a_enum const e) const
{
return e;
}
};
}
int main ()
{
std::unordered_map<a_enum,std::string> const map
{
{test0,"test0"},
{test1,"test1"},
{test2,"test2"},
{test3,"test3"},
};
for (auto const& pair : map)
{
std::cout << pair.first << " : " << pair.second << std::endl;
}
}