У меня есть следующий сценарий:Доступ к данным из базового класса с правильным типажей его производным шаблонный класс
class ScalarField
{
void* _buffer; //Array for data.
};
И производный класс:
template <typename T>
class ScalarFieldT : public ScalarField
{
ScalarFieldT(int size)
{
_data = new T[size];
_buffer = _data;
}
T& get(int index)
{
return _data[index];
}
T* _data; // Typed array for data
};
Обратите внимание, что T
может принимать только основные типы такие float, int, double и так далее.
Это очень старый унаследованный код, поэтому у меня нет слишком большой гибкости, чтобы правильно его отрегулировать, делая лучший дизайн. Что нужно сделать, так это получить доступ к данным от ScalarField::_buffer
с правильным приведением в соответствие его производного класса.
Что-то вроде этого:
void main()
{
int n = TOTAL_SIZE;
ScalarFieldT<int> typedScalarField(n);
ScalarField* scalarField = &typedScalarField;
// This is what I need to do:
int index = ELEMENT_INDEX;
float value = scalarField->method(index); // Get the value from base class correctly converted from int to float, for example.
}
Дело в том, у меня есть только доступ к базовому классу абстракции, но мне нужно, чтобы получить значение из _buffer
преобразуется в другой простой тип данных, такой поплавок, INT, uchar и т. д.
Что вы, ребята, рекомендуете?
Заранее благодарен!
Хочешь ли ты 'int' быть отлит как' float' в том, что 'основные()', например, или Вы намерены обеспечить 100%, что ' float value = scalarField-> get (index); 'будет когда-либо вызываться с помощью scalarField, который создается как« ScalarFieldT '? –
Frank
Используйте 'static_cast'. –
В момент, когда у вас есть 'ScalarField *' в руке, знаете ли вы фактический тип элементов, на которые указывает '_buffer'? Другими словами, знаете ли вы 'T' для' ScalarFieldT ', из которых этот конкретный экземпляр является подобъектом базового класса? Без этого вам, к сожалению, не повезло. Если вы посмотрите на «ScalarField» самостоятельно, вы не сможете определить, указывает ли '_buffer на массив' int 'или массив' float ', но, конечно, фактические биты в массиве должны были бы быть интерпретируются очень по-разному для этих двух случаев. –