У меня есть некоторые классы, соответствующие некоторым типам данных, которые должны кодировать и декодировать фактические данные. например,
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*>
Как мне этого добиться?
Убедитесь, что каждый тип, который может быть использован в качестве аргумента шаблона (MyInt
и т.д.) имеет typedef
с данным именем, например RepresentedType
:
class MyInt : public MyType {
public:
typedef int RepresentedType;
....
};
Теперь вы можете использовать его в шаблонном классе:
template<typename T>
class MyArray : public MyType {
....
T::RepresentedType * something();
};
(Я надеюсь, что это то, что вы хотели.)
Вы можете использовать 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]);