我继承了一些C ++代码,并且承担了摆脱警告的任务。
在这里,我们有一个成员函数指针被转换为一个函数指针。我知道成员函数指针与函数指针“不同”,因为在内部有一个隐含的“ this”参数。但是,我的前任似乎已经明确地利用了这一事实,即从成员函数指针转换为插入了附加第一个参数的函数指针。
我的问题是:
A)我可以摆脱编译器警告吗?
B)该代码在什么程度上可以保证工作?
为了这个问题,我将其缩减为一个小的main.cpp:
#define GENERIC_FUNC_TYPE void(*)(void)
#define FUNC_TYPE int(*)(void *)
class MyClass
{
public:
MyClass(int a) : memberA(a) {}
int myMemberFunc()
{
return memberA;
}
private:
int memberA;
};
int main(int argc, char*argv[])
{
int (MyClass::* memberFunc) () = &MyClass::myMemberFunc;
MyClass myObject(1);
std::cout << (myObject.*memberFunc)() << std::endl;
// All good so far
// Now get naughty, store it away in a very basic fn ptr
void(*myStoredFunction)(void) = (GENERIC_FUNC_TYPE)memberFunc; // Compiler warning
// Reinterpret the fn …Run Code Online (Sandbox Code Playgroud)