LINUX.ORG.RU

Дополнение enum базового класса

 , ,


0

6

Вот пример как сделано сейчас:

#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 (по идее можно в базовом классе делать просто отрицательные значения, а в наследнике не задавать значение (просто с нуля пойдёт нумерация)), но может есть что-то более красивое.

можно ли как-то переписать

С какой целью? А так, переписать можно, конечно.

tailgunner ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.