Я пытаюсь написать общий контейнерный класс, который я могу использовать в качестве библиотеки. Я хочу использовать его для создания экземпляров каждого объекта в коллекции ровно один раз. Поэтому я решил передать как указатель на новый экземпляр, так и вспомогательный класс enum, чтобы убедиться, что все объекты уникальны и учитываются.
После нескольких повторений в функциях, подобных этим ...
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' , затем мой аргумент шаблона для параметра шаблона нетипичного типа долженбыть выражением . Кажется, я могу преодолеть это, определив все перечисляемые классы в заголовке класса Library следующим образом:
enum class HBeams
{
HEB100,
enumSize
};
template <class T>
class HBeamLibrary
{
std::map<HBeams, T*> m_entries;
public:
void Insert(T* _entry, HBeams _key);
};
... но тогда мне все равно придется вручную создавать класс для каждой реализации. Есть ли способ заставить работать "шаблон класса enum"?