Pro*_*mer 5 c++ pointers casting void-pointers
我正在开发一个将从 C# 调用的 C++ 插件。我尝试移植的 API 带有数百个函数,其中大多数只是具有相同名称但具有不同数据类型(如 、int和float)的重载char。
我不想一遍又一遍地在 C++ 和 C# 端编写相同的代码但使用不同的数据类型,而是想使用一个带有通用指针的函数重载。我的目标是使用static_castfromvoid*到int,float然后char使用第一个成功的。
C++ 端的一个简单测试函数:
void calculate(void* input1, void* input2)
{
float *i1 = static_cast<float*>(input1);
if(i1==NULL)
std::cout<<"Bad"<<std::endl;
else
std::cout<<*i1<<std::endl;
}
int main()
{
int input1 = 5;
int input2 = 10;
calculate(&input1,&input2);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这应该输出“BAD”,但它似乎显示“7.00649e-45”,我认为这是一种未定义的行为。失败static_cast了,我不知道如何检查它是否成功。检查它是否NULL在这种情况下没有帮助。
是否可以检查void*反对static_cast是否成功?如果是这样,怎么办?
笔记:
这不是这个问题的重复。我不想从 中找出对象的类型void*。我只是想检查转换是否static_cast成功。就是这样。
使用static_cast来恢复函数参数的类型是不合适的,因为转换将在编译时从void*到完成float*完成。由于存在此类型的转换链,因此编译器不会抱怨,并且在执行期间,转换本身不会失败,即使无法保证其结果。
这同样适用于调用计算函数时从int*到 的转换。void*
也许对于这种情况,您可以考虑使用模板函数来利用C++ 的元编程功能。
这是一个开头的片段:
template <class T*>
void calculate(T* a, T* b) {
// your implementation here
}
Run Code Online (Sandbox Code Playgroud)
编辑
如果您只需要导出几种类型的模板函数,例如 int、float、double 等,您可以考虑在库的一个 cpp 文件中为每种类型添加模板专门化,其中包括模板函数所在的标头宣布。
这是该类型的示例int*。
template __declspec(dllexport) calculate<int*>(int* a, int* b);
Run Code Online (Sandbox Code Playgroud)