Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将函数指针从一个原型转换到另一个原型并返回?_C++_Winapi - Fatal编程技术网

C++ 将函数指针从一个原型转换到另一个原型并返回?

C++ 将函数指针从一个原型转换到另一个原型并返回?,c++,winapi,C++,Winapi,我有一个基类,它包含WNDPROC成员,但一些派生类(如控件)使用SUBCLASSPROC,它们都是指向窗口过程的函数指针,只是原型不同而已 我希望避免在所有派生类中都有2个成员,因为所有实例只使用一个成员 所以我的问题是,我是否可以从一个函数指针重新解释\u cast到另一个函数指针,然后再进行反向转换?安全吗 例如: SUBCLASSPROC fnptr = /* some function */ WNDPROC data = reinterpret_cast<WNDPROC>

我有一个基类,它包含
WNDPROC
成员,但一些派生类(如控件)使用
SUBCLASSPROC
,它们都是指向窗口过程的函数指针,只是原型不同而已

我希望避免在所有派生类中都有2个成员,因为所有实例只使用一个成员

所以我的问题是,我是否可以从一个函数指针重新解释\u cast到另一个函数指针,然后再进行反向转换?安全吗

例如:

SUBCLASSPROC fnptr = /* some function */

WNDPROC data = reinterpret_cast<WNDPROC>(fnptr);

// is this pointer "original_pointer" valid now?
SUBCLASSPROC original_pointer = reinterpret_cast<SUBCLASSPROC>(data);
子类proc fnptr=/*某些函数*/
WNDPROC数据=重新解释铸件(fnptr);
//此指针“原始指针”现在有效吗?
子类PROC original_pointer=重新解释强制转换(数据);
基本上,在本例中,
数据
指针仅用于存储不同类型的函数指针


顺便说一句,我知道我可以使用模板成员,但我的设计不允许使用,因为
数据
指针是另一个我无法控制的结构的成员。

是的。如果将一个函数指针强制转换为另一个函数指针并将其强制转换回,则可以保证返回原始值。当然,在使用它之前,你必须先把它扔回去。另一种选择是使用联合体。@RaymondChen谢谢!你的答案和博客文章都很棒,直截了当
std::variant
可能是一个更安全的选项现在介绍的另一个问题是,这样的强制转换将生成警告:但看起来我必须在这方面使用一些杂注,这意味着在所有调用方代码中使用杂注,或者使用一些函数进行转换并将杂注设置在一个位置。正如Raymond所建议的,使用工会。尽可能避免铸造。是的。如果将一个函数指针强制转换为另一个函数指针并将其强制转换回,则可以保证返回原始值。当然,在使用它之前,你必须先把它扔回去。另一种选择是使用联合体。@RaymondChen谢谢!你的答案和博客文章都很棒,直截了当
std::variant
可能是一个更安全的选项现在介绍的另一个问题是,这样的强制转换将生成警告:但看起来我必须在这方面使用一些杂注,这意味着在所有调用方代码中使用杂注,或者使用一些函数进行转换并将杂注设置在一个位置。正如Raymond所建议的,使用工会。尽可能避免铸造。