C ++ сопоставить шаблон производного класса

0

Привет У меня есть следующие структуры и типы данных:

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;
  • 0
    Карты не могут отображать типы, только значения некоторого типа. Тем не менее, вы можете использовать шаблон, если ключ является константным выражением времени компиляции.
  • 0
    ... если сам тип не является значением. Что было бы очень странно, если бы это была ваша цель. @ Боаз, уточни свой вопрос.
Показать ещё 3 комментария
Теги:

2 ответа

2

Вы можете использовать что-то вроде (для времени компиляции):

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;
};
0

Wrap WorkerA и WorkerB в соответствующие классы, полученные из общего базового класса, в дополнение к наследованию от std :: vector (множественное наследование). Затем просто определите свое значение карты как умный указатель на базовый класс (или обычный указатель, если вы хотите поместить рабочие объекты в стек).

Ещё вопросы

Сообщество Overcoder
Наверх
Меню