Я пытаюсь написать общий класс контейнера, который я могу использовать в качестве библиотеки. Я хочу использовать его для создания экземпляра каждого объекта в коллекции ровно один раз. Поэтому я решил передать как указатель на новый экземпляр, так и соответствующий класс перечисления, чтобы убедиться, что все объекты уникальны и учтены.
После повторения себя несколько раз в таких функциях...
enum class HBeams
{
HEB100,
enumSize
};
void HBeam::CreatePredefinedHBeam(std::map<HBeams, HBeam *> & _library, HBeams _key, ushort _width, ushort _height)
{
if(_library.count(_key) == 0)
{
_library.insert(std::pair<HBeams, HBeam *>(_key, new HBeam{ _width, _height } ));
if(_library.count(_key) == 1)
{
Logger::Log(Status::OK, "Created predefined HBeam with ID ", static_cast<int>(_key));
return;
}
}
Logger::Log(Status::Warning, "Failed to create predefined HBeam with ID ", static_cast<int>(_key));
return;
}
... Я чувствовал, что должен создать для этого общий класс-контейнер. Однако,
// Library.h
template <class T, enum class E>
class Library
{
std::map<E, T*> m_entries;
public:
void Insert(T* _entry, E _enum);
};
// Library.cpp
template<class T, enum class E>
void Library<T, E>::Insert(T* _entry, E _enum)
{
...
}
... сначала говорит мне, что я должен использовать 'enum', а не 'enum class', а затем мой аргумент шаблона для нетипового параметра шаблона должен быть выражением. Кажется, я могу преодолеть это, определив все классы перечисления в заголовке класса библиотеки следующим образом:
enum class HBeams
{
HEB100,
enumSize
};
template <class T>
class HBeamLibrary
{
std::map<HBeams, T*> m_entries;
public:
void Insert(T* _entry, HBeams _key);
};
... но тогда мне все равно придется вручную создавать класс для каждой реализации. Есть ли способ заставить работать «шаблон класса enum»?