是否可以将函数指针转换为整数?

时间:2015-11-07 20:33:00

标签: c++ c++14

我想以明确的方式做这样的事情:

struct S
{
  static some_integral_type f() noexcept
  {
    return some_cast<...>(&f);
  }
};

整数可以是有符号或无符号的。结果应与uintptr_tintptr_t生成的对象指针的强制转换相同。对于函数指针,AFAIK强制转换为不可能。即使是uintmax_tintmax_t的演员也可能不适用于我所知道的一切。

我需要这个,所以我可以从函数指针生成一个唯一的“句柄”,然后我可以在switch语句中使用它。

3 个答案:

答案 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   函数指针是一个代码指针。