检查使用 static_cast 将 void* 转换为 Object 是否成功

Pro*_*mer 5 c++ pointers casting void-pointers

我正在开发一个将从 C# 调用的 C++ 插件。我尝试移植的 API 带有数百个函数,其中大多数只是具有相同名称但具有不同数据类型(如 、intfloat)的重载char

我不想一遍又一遍地在 C++ 和 C# 端编写相同的代码但使用不同的数据类型,而是想使用一个带有通用指针的函数重载。我的目标是使用static_castfromvoid*intfloat然后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成功。就是这样。

Gab*_*ano 1

使用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)