【发布时间】:2017-01-03 15:39:33
【问题描述】:
我有以下场景:
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中的值转换为另一种简单的数据类型,如float、int、uchar等。
你们有什么推荐的?
提前致谢!
【问题讨论】:
-
您是否希望在该
main()示例中将int转换为float,或者您是否打算确保 100% 仅使用 scalarField 调用float value = scalarField->get(index);实例化为ScalarFieldT<float>? -
使用
static_cast。 -
所以基本上,您所拥有的只是一个
void*指针,但不知道它可能指向什么?那么恐怕你不能用那个指针做任何有用的事情。你必须重新审视你的设计。 -
我对您要解决的问题或您必须努力解决的限制条件了解不够,无法提供建议。
-
@JoãoPauloNavarro this 是一个可行的解决方案吗?让我知道,如果它适合你,我会把它放在答案中。它或多或少地完成了您的要求,即从底层缓冲区中提取参数,将其转换为原始类型,然后转换为请求的类型。