gpt4 book ai didi

c++ - 将 void* 转换为仅在运行时已知的几种类型

转载 作者:行者123 更新时间:2023-11-30 01:50:15 25 4
gpt4 key购买 nike

我正在将我的 C++ 程序连接到 C++ 框架。

框架返回一个 void* 指针,指向一组使用 malloc() 初始化的数据:

void* getData() {
return framework->returnPointer();
}

数据的类型只有在运行时才知道(从我的程序),框架有以下功能:

size_t ndf_sizeof(ndf_typeid id) {
switch(id) {
case NDF_INT64:
return sizeof(int64_t);
case NDF_FLOAT:
return sizeof(float);
case NDF_DOUBLE:
return sizeof(double);
}
return 0;
}

数据可以采用几种不同的类型,类型存储为 ndf_type(即数据类型的整数标识符)。数据在运行时不会改变类型。我可以检索数据的ndf_type,也可以检索数据的大小。

我需要能够做两件事:

  1. 在运行时声明并初始化一个与数据相同类型的缓冲区
  2. 遍历数据并将值放入我的缓冲区

我的困难出现在围绕 void* 指针工作时,并且只在运行时知道数据类型,它本身可以采用几种不同的类型。我曾尝试使用模板和通用数据结构,但无济于事。

非常感谢此问题的解决方案。

最佳答案

由于声明是在编译时发生的,因此您不能在运行时声明类型。

但是,您可以在编译时声明所有可能的类型,准备这些类型的指针,并在运行时转换为适当的指针。根据您的要求,我对此进行了详细说明。

我假设你有一个指针,比如:void * raw_data,并且你知道类型,ndf_typeid id。

你可以像这样分配你需要的指针:

int64_t *p1 = 0;
float *p2 = 0;
double *p3 = 0;
switch(id) {
case NDF_INT64: p0 = (int64_t *) raw_data; break;
case NDF_FLOAT: p1 = (float *) raw_data; break;
case NDF_DOUBLE: p2 = (double *) raw_data; break;
}

然而,真正的工作在那之后才开始——你想要做某事,你会有很多“if”和“case”语句来执行你想执行的代码。这就是有时人们使用虚拟方法的原因:

struct Any {
size_t _size;
virtual void doit() = 0;
};

template < typename T > struct Typ: Any {
T _data;
Typ ( void * data ): _size(sizeof(T)), _data(*(T*)data) {}
virtual void doit {
cout << _data << " has size " << _size;
}
}

Any * any = 0;

switch(id) {
case NDF_INT64: any = new Typ<int64_t> (raw_data); break;
case NDF_FLOAT: any = new Typ<float > (raw_data); break;
case NDF_DOUBLE: any = new Typ<double > (raw_data); break;
}

any->doit();

这只会打印出值。然后,您可以为每个 Typ 覆盖 doit:

template<> void Typ<float>::doit() {
cout << "this is a float: " << _data;
}

这允许您根据类型执行不同的工作。

关于c++ - 将 void* 转换为仅在运行时已知的几种类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27667347/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com