Привет У меня есть следующие структуры и типы данных:
enum EWorkerType
{
WorkerType1,
WorkerType2,
LastWorker
};
template<class DerivedType>
struct CHandlerMethod
{
};
struct CFunctorA : public CHandlerMethod<CFunctorA>
{
};
struct CFunctorB : public CHandlerMethod<CFunctorB>
{
};
template<class TFunctor>
struct CWorkerHandler
{
CHandlerMethod<TFunctor>* m_HandlerMethod;
};
typedef std::vector<CWorkerHandler<CFunctorA>*> WorkerA;
typedef std::vector<CWorkerHandler<CFunctorB>*> WorkerB;
Мне нужно направление для создания карты const между EWorkerType :: WorkerType1 и WorkerA и EWorkerType :: WorkerType2 в WorkerB.
Я пробовал это направление
struct WorkersMapping
{
WorkersMapping()
{
m_WorkersMapper.insert(EWorkerType::WorkerType2, CFunctorA::value_type());
}
static std::map<EWorkerType, ???> m_WorkersMapper;
};
static WorkersMapping m_WorkersMapping;
Вы можете использовать что-то вроде (для времени компиляции):
template <EWorkerType> struct WorkersMapping;
template <> struct WorkersMapping<WorkerType1>
{
using type = WorkerA;
};
template <> struct WorkersMapping<WorkerType2>
{
using type = WorkerB;
};
или если ваши значения enum
правильно выбраны, например:
template <EWorkerType E> struct WorkersMapping
{
using type = typename std::tuple_element<E, std::tuple<WorkerA, WorkerB>>::type;
};
Wrap WorkerA и WorkerB в соответствующие классы, полученные из общего базового класса, в дополнение к наследованию от std :: vector (множественное наследование). Затем просто определите свое значение карты как умный указатель на базовый класс (или обычный указатель, если вы хотите поместить рабочие объекты в стек).