Получение данных из пустого указателя с использованием идентификации типа во время выполнения

У меня есть некоторые классы, соответствующие некоторым типам данных, которые должны кодировать и декодировать фактические данные. например,
class MyInt32 будет иметь функцию для кодирования целочисленного значения и декодирования его из потока закодированных байтов.
Все эти классы являются производными от базового класса, MyTypes, Во время декодирования, после получения значения из закодированного
Строка Я положил значение в соответствующих типах данных, например, int в случае MyIntи вернуть данные в виде void *,

На
принимающей стороной я указываю указатель на (int *) и затем разыменовываете это, чтобы поместить это в результат.

Но теперь мне нужен тип для массивов. В случае массивов я использую шаблоны, чтобы сказать, что массив собирается
держать. то есть,

template<typename T>
class MyArray:public MyType
{
vector<T *> mydata;
....
};

В функции декодирования я буду вызывать декодирование типа T. Но теперь он просто возвращает void*, Мой массив не будет знать
какой будет декодированный тип. Так что я не могу набрать void * и разыменовывать его, чтобы получить значение. То есть,
Если я возьму массив MyInt

MyArray<MyInt> data;

Массивdataне будет знать, что его декодированный результат будет vector<int>, И предпочтительно передавать данные как vector<int> скорее, чем vector<int*>
Как мне этого добиться?

0

Решение

Убедитесь, что каждый тип, который может быть использован в качестве аргумента шаблона (MyInt и т.д.) имеет typedef с данным именем, например RepresentedType:

class MyInt : public MyType {
public:
typedef int RepresentedType;
....
};

Теперь вы можете использовать его в шаблонном классе:

template<typename T>
class MyArray : public MyType {
....
T::RepresentedType * something();
};

(Я надеюсь, что это то, что вы хотели.)

3

Другие решения

Вы можете использовать boost :: any class для ваших целей. Это простой и эффективный способ получить ценность любого
сохраненные данные на основе идентификации типа времени выполнения.

vector<boost::any> somevec;
boost::any obj= new MyClass<SomeTemplate>;
somevec.push_back(obj);

SomeTemplate ret = boost::any_cast<SomeTemplate>(somevec[0]);
1

По вопросам рекламы [email protected]