映射一个c++模板派生类

C++ map a template derived class

本文关键字:派生 c++ 一个 映射      更新时间:2023-10-16

你好,我有一个以下结构和数据类型:

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;

我需要一个方向来创建EWorkerType::WorkerType1到WorkerA和EWorkerType::WorkerType2到WorkerB之间的const映射。

我试过这个方向

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

将WorkerA和WorkerB分别封装到从公共基类派生的类中,此外还继承了std::vector(多重继承)。然后简单地将映射值定义为指向基类的智能指针(或者如果想将工作对象放在堆栈上,则定义为常规指针)。