我对C ++不是很了解,但是我试图创建一个可以扩展为创建一种动态枚举的通用基类。可能有更好的方法来做到这一点,我可以接受建议,但我的主要问题是为什么我收到错误C2338 The C++ Standard doesn't provide a hash for this type
。
基本枚举模板类
template <typename T>
class Enums
{
public:
BOOL HasValue(T enumValue) const
{
auto it = this->m_EnumPairs.find(enumValue);
return (it != this->m_EnumPairs.end());
}
const DWORD Count() const
{
return this->m_EnumPairs.size();
}
const DWORD &operator[](T enumValue) const
{
auto it = this->m_EnumPairs.find(enumValue);
if (it == this->m_EnumPairs.end())
return 0;
return it->second;
}
const DWORD GetVersionCode() const
{
return this->m_VersionCode;
}
static const DWORD Count(DWORD versionCode)
{
T derived(versionCode);
return derived.Count();
}
protected:
DWORD m_VersionCode;
Enums(DWORD versionCode) : m_VersionCode(versionCode), m_NextValue(0) { }
virtual ~Enums() { }
void Add(T enumValue)
{
for (auto it = this->m_EnumPairs.cbegin(); it != this->m_EnumPairs.cend(); it++)
{
if (it->first == enumValue)
throw std::exception("Enum key already defined");
if (it->second == this->m_NextValue)
throw std::exception("Enum value already exists");
}
this->m_EnumPairs[enumValue] = this->m_NextValue++;
}
void Add(T enumValue, DWORD value)
{
this->m_NextValue = value;
this->Add(valueName);
}
private:
std::unordered_map<T, DWORD> m_EnumPairs;
DWORD m_NextValue;
};
派生的枚举.h
namespace Test
{
typedef enum _Enum
{
EnumValue1,
EnumValue2,
EnumValue3,
EnumValue4,
EnumValue5,
EnumValue6,
EnumValue7,
EnumValue8
} Enum;
}
class DerivedEnum : public Enums<Test::Enum>
{
public:
DerivedEnum(DWORD versionCode);
~DerivedEnum();
};
派生的枚举.cpp
DerivedEnum::DerivedEnum(DWORD versionCode) : Enums(versionCode)
{
this->Add(Test::EnumValue1);
this->Add(Test::EnumValue2);
this->Add(Test::EnumValue3);
this->Add(Test::EnumValue4);
this->Add(Test::EnumValue5);
this->Add(Test::EnumValue6);
if (versionCode > 200)
this->Add(Blocks::EnumValue7);
this->Add(Blocks::EnumValue8);
}
DerivedEnum::~DerivedEnum()
{
}
用法
Enums<DerivedEnum>::Count(250)
我知道我做错了什么,我只是想知道自己做错了什么以及如何做Enums<DerivedEnum>::Count(250)
之类的事情。错误集中在静态Count
函数周围,当我删除静态函数并调用它时,错误完全消失。
修改
回答评论中提出的问题:使用这个问题是为了获得&#34; enum&#34;中的条目大小或数量。例如,如果我需要从文件中读取结构,并且在该结构中是一个项目数组:
struct DataFromFile
{
int flags;
int array[SIZE_OF_ENUM];
}
如果我的这个文件的不同版本在数组中包含不同数量的项目,我可以使用&#34; enum&#34; class,用于根据Enums<DerivedEnum>::Count(250)
确定要读取的字节数。如果这没有意义,我会尝试进一步澄清。
更新
正如ZDF在评论中所说,将unordered_map
更改为map
可以解决问题。 unordered_map
需要hash
函数,默认情况下不知道如何散列我的自定义类,map
不需要哈希值,因此在这种情况下效果很好。