在C ++中运行时调用模板时,是否可以切换模板的参数类型?

时间:2018-10-03 20:26:24

标签: c++ templates runtime typename

首先,我有一个类管理器,它可以管理不同的原始数据类型。因此,管理器具有模板方法。要调用它们,我有多个带有切换用例的方法,可以选择将使用哪种类型的模板方法。

我在C ++上有下一个代码:

enum MyCallType
{
   MCT_DOUBLE,
   MCT_FLOAT,
   MCT_INT
}

template<class T>
class MyBuffer
{
public:
   MyBuffer (int size, MyCallType type)
   : mData (new T[size]),
   mType (type)
   {}
   ~MyBuffer ()
   {
   delete mData;
   }
   MyCallType getType () { return mType; }

   T* getData(){ return mData; }
private:
   T *mData;
   MyCallType mType;
}


class Manager
{
public:
   Manager (){}
   /* a lot of code */
   void process ()
   {
       switch (mType)
       {
           case MyCallType::MCT_DOUBLE:
           customProcess <double>();
           break;

           case MyCallType::MCT_FLOAT:
           customProcess <float>();
           break;

           / *more cases*/
       }
   }

   template<typename T>
   void customProcess ()
   {
       MyBuffer<T> *myCast = reinterpret_cast <MyBuffer <T> *>(mBuffer);
       T *myData = myCast->getData ();
       /* a lot of process */
   }

private:
   void *mBuffer;
   MyCallType mType;
}

我想避免在“ process()”上切换大小写,因为我在管理器上有很多以相同方式工作的功能。有谁能够帮助我?我想要的可能吗?

1 个答案:

答案 0 :(得分:0)

正如François所说的“模板参数和运行时输入无法交互”,因此无法在运行时更改模板的参数,但是一个好的解决方案是使用submitstd::variant来避免如果您使用的是std::any(如Miles所说),请切换大小写。

我实际使用的实现是使用宏,因为我想减少代码,而我正在使用C++17