我想以明确的方式做这样的事情:
struct S
{
static some_integral_type f() noexcept
{
return some_cast<...>(&f);
}
};
整数可以是有符号或无符号的。结果应与uintptr_t
或intptr_t
生成的对象指针的强制转换相同。对于函数指针,AFAIK强制转换为不可能。即使是uintmax_t
和intmax_t
的演员也可能不适用于我所知道的一切。
我需要这个,所以我可以从函数指针生成一个唯一的“句柄”,然后我可以在switch
语句中使用它。
答案 0 :(得分:4)
一般来说,没有。
首先,成员函数指针(和成员指针)是标准的非常的毛茸茸的野兽。
所以,暂时不要理会他们。
接下来,甚至可能无法通过void*
往返普通的旧函数指针,并且标准只定义了一个通过整数转发数据指针的类型,如果实现支持这样:
(u)intptr_t
。
当然,如果您的实现具有足够大的整数类型,您可以通过将指针读取为unsigned char[]
并将其组合为单个数值来手动执行此操作,然后该操作是可逆的。
请注意,如果你走这条路线,相等的函数指针会产生不同的数字,因为同一个指针可以有多个可能的表示形式(例如填充字节,非值位,分段)......
答案 1 :(得分:1)
您可以尝试使用元函数选择与函数指针大小相同的整数 - 所需大小为sizeof(void(*)())
。但是,不能保证存在任何这样的整数类型。
实际上,将它转换为void *或intptr_t几乎可以在所有主流平台上运行。
答案 2 :(得分:0)
取自Can std::hash be used to hash function pointers?
在之前的尝试中,我尝试将函数指针强制转换为 void *,这是不允许的,不会编译(参见: https://isocpp.org/wiki/faq/pointers-to-members#cant-cvt-memfnptr-to-voidptr 详情)。原因是void *是数据指针,而a 函数指针是一个代码指针。