检查是否已成功将void*转换为静态_强制转换的对象 我正在研究一个C++插件,它将由C语言调用。我尝试移植的API附带了数百个函数,其中大多数只是同名的重载,但数据类型不同,如int、float和char < >不要用相同的代码编写代码,而是在C++和C语言的一个侧面上反复使用不同的数据类型,我想用一个泛型指针来使用它的一个函数重载。我的目标是使用static\u 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; } void计算(void*input1,void*input2) { 浮点*i1=静态_转换(输入1); 如果(i1==NULL) std::cout

检查是否已成功将void*转换为静态_强制转换的对象 我正在研究一个C++插件,它将由C语言调用。我尝试移植的API附带了数百个函数,其中大多数只是同名的重载,但数据类型不同,如int、float和char < >不要用相同的代码编写代码,而是在C++和C语言的一个侧面上反复使用不同的数据类型,我想用一个泛型指针来使用它的一个函数重载。我的目标是使用static\u 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; } void计算(void*input1,void*input2) { 浮点*i1=静态_转换(输入1); 如果(i1==NULL) std::cout,c++,pointers,casting,void-pointers,C++,Pointers,Casting,Void Pointers,使用static\u cast来恢复函数参数的类型是不合适的,因为转换将在编译时从void*到float*进行。由于存在此类型的转换链,编译器不会抱怨,并且在执行期间,转换本身不会失败l、 即使对结果没有保证 这同样适用于调用计算函数时从int*到void*的转换 也许对于这种情况,可以考虑使用模板函数来开发C++的强>元编程< /强>特性。 以下是一个剪贴画: template <class T*> void calculate(T* a, T* b) { // your

使用
static\u cast
来恢复函数参数的类型是不合适的,因为转换将在编译时从
void*
float*
进行。由于存在此类型的转换链,编译器不会抱怨,并且在执行期间,转换本身不会失败l、 即使对结果没有保证

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

也许对于这种情况,可以考虑使用模板函数来开发C++的强>元编程< /强>特性。 以下是一个剪贴画:

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

static\u cast
不执行类型检查,不能用于可靠地检索类型。此外,传递到函数中的是一个
void*
指针,此时类型信息丢失,甚至
dynamic\u cast
都没有帮助。因此,即使在纯C语言中,如果没有模板,这将是一个很难解决的问题++。事实上,
void*
指针实际上是一个C#
系统。IntPtr
使问题更加复杂,据我所知,没有足够强大的互操作层来检索原始类型(即使是原始类型)


像这样的问题是为什么样板代码生成器被发明的原因。有很多这样的代码,你可能想做一些研究来找出哪一个最适合你的需要。COG通过插入C++中嵌入的代码生成脚本(或C,或其他)来工作。您可能会发现它值得(相对较小的)时间投资(与手动生成样板代码相比).

存储
typeid
。或者更好,使用
std::any
std::variant
。强制转换不会失败,但取消引用其结果是未定义的。您或编译器都无法确定
无效*
静态强制转换的“原始”类型“即使它被声明为代码> Value*/Cuff>,我知道它确实是<代码>浮点*/COD>。”所以,如果它不是浮点*,它就在你的肩膀上。因此,这个代码> Value*/Cuff>实际上是从C++中传入的(如<代码>系统。你必须在C++中执行类型检查,然后调用C++函数,这样数据可以适当地编组。我也考虑模板,但是不能使用它,因为模板函数在构建它作为DLL时不能导出。最后的函数将从C中调用,就像我在这个问题中提到的。是的,使用模板可以解决这个问题。问题很容易解决,而且,有人认为std::any。但这不是答案,我想。@Constructor你读过我的评论吗,因为你不能在dll插件中导出模板函数,所以不能这样做?
std::any
也不是一个选项。@程序员我明白了,我的意思是人们应该解决你的问题,而不是改变实现的方式编辑它。@G.Giordano我看到了你的编辑,但这也没用。
calculate(int*a,int*b)这是为什么我使用了 Value*/Cuff>这是一个泛型指针。每个函数都有大约5个重载,大约有900个。我问这个问题,以便我可以使用<代码> Value*/Cord>,避免在C++和C端声明每个X和写同样的代码。这要花很长时间。完成,如果不是几个月。
   template __declspec(dllexport) calculate<int*>(int* a, int* b);