Вот пример как сделано сейчас:
#include <iostream>
#include <map>
class BaseEnumClass
{
public:
BaseEnumClass()
{
m_mapping[EnumClass::BASE_A] = 100;
m_mapping[EnumClass::BASE_B] = 110;
}
enum EnumClass
{
BASE_A = 10
, BASE_B = 11
};
std::map<int, int> m_mapping;
};
class DerivedEnumClass
: public BaseEnumClass
{
public:
DerivedEnumClass()
{
m_mapping[EnumClass::DERIVED_C] = 120;
m_mapping[EnumClass::DERIVED_D] = 130;
}
enum EnumClass
{
DERIVED_C = 12
, DERIVED_D = 13
};
};
int main(int argc, char** argv)
{
DerivedEnumClass d;
for (const auto& [key, value] : d.m_mapping)
{
std::cout << key << " -> " << value << std::endl;
}
std::cout << d.m_mapping[DerivedEnumClass::DERIVED_C] << std::endl;
std::cout << d.m_mapping[BaseEnumClass::BASE_A] << std::endl;
return 0;
}
Сам код сильно утрирован, но суть показана верно. Подскажите пожалуйста можно ли как-то переписать этот код используя enum class, либо какие-то другие сущности?
Необходимо (обязательно) уметь делать так:
m_mapping[EnumClass::DERIVED_C] = 120;
std::cout << d.m_mapping[BaseEnumClass::BASE_A] << std::endl;
Т.е. уметь обращаться в мапу (которая находится в базовом классе) по Id, которые есть как и в базовом классе, так и в наследнике.
Обязательно должа быть возможность обращения по ВНЯТНОМУ идентификатору. Ну и желательно не следить самому за id которые хранятся в enum (по идее можно в базовом классе делать просто отрицательные значения, а в наследнике не задавать значение (просто с нуля пойдёт нумерация)), но может есть что-то более красивое.