gpt4 book ai didi

c++ - 检查 void* to Object with static_cast 是否成功

转载 作者:太空狗 更新时间:2023-10-29 22:55:56 26 4
gpt4 key购买 nike

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

我不想一遍又一遍地在 C++ 和 C# 端编写相同的代码但使用不同的数据类型,我想使用一个带有通用指针的函数重载。我的目标是使用 static_castvoid*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;
}

这应该输出“BAD”,但它似乎显示“7.00649e-45”,我认为这是未定义的行为。 static_cast 失败,我不知道如何检查它是否成功。检查它是否为 NULL 在这种情况下没有帮助。

是否可以通过 static_cast 检查 void* 是否成功?如果是,怎么办?

注意:

这不是 this 的拷贝问题。我不想从 void* 中找出对象的类型。我只想检查转换或 static_cast 是否成功。就是这样。

最佳答案

使用 static_cast 来恢复函数参数的类型是不合适的,因为转换将在编译时完成,从 void* float *。由于存在这种类型的转换链,编译器不会提示,并且在执行期间,转换本身不会失败,即使不能保证其结果。

这同样适用于调用计算函数时从 int*void* 的转换。

也许对于这种情况,您可以考虑使用模板函数来利用 C++ 的元编程 功能。

这是一个开始的片段:

template <class T*>
void calculate(T* a, T* b) {
// your implementation here
}

编辑

如果您只需要为几种类型导出模板函数,如 int、float、double 等,您可以考虑在库的一个 cpp 文件中为每种类型添加一个模板特化,其中包含声明了模板函数。

这是 int* 类型的示例。

   template __declspec(dllexport) calculate<int*>(int* a, int* b);

关于c++ - 检查 void* to Object with static_cast 是否成功,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49830867/

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