Sam*_*tha 3 c polymorphism virtual-functions c11
我想存储一些数据,它们可以是仅在运行时才知道的其他类型。我不想浪费任何内存,而是想将所有数据读取为浮点值。在C ++中,我会做这样的事情
struct IA {
virtual float value(int index) = 0;
};
template<class T>
struct A : public IA {
A(T* bytes, uint32_t size) {
values.resize(size);
memcpy(values.data(), bytes, size*sizeof(T));
}
float value(int index) override {
return static_cast<float>(values[index]);
}
std::vector<T> values;
};
int main() {
uint16_t bytes[] = {1, 2, 3, 4, 5 };
IA *a = new A<uint16_t>(bytes, 5);
float value = a->value(0);
delete a;
}
Run Code Online (Sandbox Code Playgroud)
我的问题是如何使用C而不是C ++做到这一点。我可以将数据存储在uint8_t数组中,并存储nr位和一个signed值。然后,每当我从数组中读取一个值时,就使用开关盒和强制类型转换。但是,如果数组很大并且读取次数很多,那将是昂贵的。
我还希望能够在不需要进行任何特殊情况的情况下传递数组?
您可以使用函数指针模拟虚拟方法:
typedef struct
{
void* userData;
float (*value)(void*, int);
} IA;
float get_float_from_uint16(void* userData, int index)
{
return ((uint16_t*) userData)[index];
}
int main()
{
uint16_t bytes[] = {1, 2, 3, 4, 5 };
IA a = {bytes, &get_float_from_uint16};
int index = 0;
float f = a.value(a.userData, index);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
281 次 |
| 最近记录: |