【发布时间】:2018-09-24 15:10:30
【问题描述】:
我正在开发一个将从 C# 调用的 C++ 插件。我尝试移植的 API 带有数百个函数,其中大多数只是重载,名称相同,但数据类型不同,如 int、float 和 char。
我不想一遍又一遍地编写相同的代码,但在 C++ 和 C# 端使用不同的数据类型,我想使用一个带有通用指针的函数重载。我的目标是使用static_cast 从void* 到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;
}
这应该输出“BAD”,但它似乎显示“7.00649e-45”,我认为这是一种未定义的行为。 static_cast 失败了,我不知道如何检查它是否成功。检查它是否是 NULL 在这种情况下没有帮助。
是否可以检查void* 到带有static_cast 的对象是否成功?如果有,怎么做?
注意:
这不是this 问题的重复。我不想从void* 中找出对象的类型。我只想检查转换或static_cast 是否成功。就是这样。
【问题讨论】:
-
存储
typeid。或者更好的是,使用std::any或std::variant。 -
强制转换没有失败,但取消引用其结果是未定义的。您或编译器都无法确定
void*的“原始”类型。 -
static_cast的意思是“即使它被声明为void*,我知道它确实是float*。”因此,如果它不是浮子*,它就在你的肩膀上。 -
所以这个
void*实际上是从C#进来的(作为System.IntPtr)? -
你可能不走运。没有办法以某种方式检索 C++ 中的类型(至少我知道)。您必须在 C# 中执行类型检查,然后调用您的 C++ 函数,以便可以适当地封送数据。
标签: c++ pointers casting void-pointers