Могу ли я переключить тип параметра шаблона во время вызова его во время выполнения в C ++? - PullRequest
0 голосов
/ 03 октября 2018

Во-первых, у меня есть менеджер классов, который может управлять различными примитивными типами данных.По этой причине в менеджере есть шаблоны методов.Чтобы вызвать их, у меня есть несколько методов со случаем переключения, чтобы выбрать, с каким типом будет вызываться метод шаблона.

У меня есть следующий код на 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 голосов
/ 05 ноября 2018

Как сказал Франсуа «Аргументы шаблона и входные данные среды выполнения не могут взаимодействовать», изменение параметров шаблона во время выполнения невозможно, но хорошим решением может быть использование std::variant или std::any, чтобы избежать случаев переключения, есливы используете C++17 (как сказал Майлз).

Реализация, которую я фактически использую, была использованием макросов, потому что я хотел уменьшить код, и я использую C++11

...