我可以将方法指针转换为 long(int, size_t)

Can i cast method pointer to long(int, size_t)

我的问题是我需要像整数一样表示指向 class 方法的指针。所以这不是函数的问题,例如 void (*func)() 很容易转换为数字,但是当我试图用任何方式将 void (&SomeClass::SomeMethod) 转换为整数时,编译说这是不可能的

C-style cast from 'void(ForthInterpreter::*)()' to long is not alowed

我尝试了 (size_t)&ForthInterpreter::CodeFLiteralstatic_cast<size_t>(&ForthInterpreter::CodeFLiteral),但我遇到了同样的错误。应该假设函数指针和方法指针之间存在主要区别,但它是什么?我怎样才能成功投射它? 我在 C++11 版本中使用 clang++。

for example void (*func)() easy cast to number

不,不是,它只是在您的特定机器上看起来像。在某些系统中,指针表示为两个内部值,例如阅读 far pointers.

更不用说你邀请的 64 位问题了,longgcccl 上的 x64 中是不同的类型,例如,两个非常 main-stream编译器。

when i trying to cast void (&SomeClass::SomeMethod) to integer with any ways compiles says it's impossible

当然可以,因为不仅 class 成员指针存在与上述相同的问题,而且它绝对需要一个指向对象实例本身的指针(通常作为寄存器传递,并且通常 ecxrcx)。没有比指向正确类型的指针更便携的方式来表示它了。

i need to represent a pointer to class's method like integer number

不,你不想,你只是想要。那里有区别。解决方案是适应可能的情况。

A pointer-to-member 不仅仅是一个简单的指针,它要复杂得多。根据编译器的实现,它可能是 2 个指针,一个指向对象,一个指向方法。或者它可以是对象指针和方法 table 的偏移量。等等。

因此,pointer-to-member 无法像您尝试的那样以整数形式存储 as-is。因此,您需要通过将指针存储在整数中来找到解决任何问题的另一种解决方案。