如何将各种类型的函数指针存储在一起?

iam*_*ind 2 c c++ function-pointers

可以使用泛型存储正常指针void*.例如

void* arr[10];
arr[0] = pChar;
arr[1] = pINt;
arr[2] = pA;
Run Code Online (Sandbox Code Playgroud)

不久之后,我遇到了一个讨论,void*可能无法在所有平台(例如64位或更多)中存储没有数据丢失的函数指针.我不确定这个事实.

如果这是真的,那么存储函数指针集合的最便携方式是什么?[注意:这个问题没有令人满意地回答这个问题.]

编辑:我将使用索引存储此函数指针.每当访问此集合时,都会对每个索引进行类型转换.截至目前,我感兴趣的只是制作阵列或vector它.

Mic*_*urr 9

您可以将函数指针转换为任何函数类型的另一个函数指针,然后返回而不会丢失.

因此,只要通过函数指针进行调用,首先将其类型转换回正确的类型,就可以将所有函数指针存储在以下内容中:

typedef void (*fcn_ptr)(void);  // 'generic' function pointer

fcn_ptr arr[10];
Run Code Online (Sandbox Code Playgroud)

  • +1 只为正确答案。您可能应该引用标准,因为 SO 的其余部分似乎认为 OP 完全合理的请求是误导、非法或无法正确使用的。 (2认同)

CB *_*ley 6

可以将指向函数的指针转换为指向具有a的不同类型的函数的指针reinterpret_cast.如果将其转换回原始类型,则可以保证返回原始值,以便您可以使用它来调用该函数.(ISO/IEC 14882:2003 5.2.10 [expr.reinterpret.cast]/6)

您现在只需要为数组选择任意函数指针类型.void(*)()是一种常见的选择.

例如

int main()
{
    int a( int, double );
    void b( const char * );

    void (*array[])() = { reinterpret_cast<void(*)()>(a)
                        , reinterpret_cast<void(*)()>(b) };

    int test = reinterpret_cast< int(*)( int, double) >( array[0] )( 5, 0.5 );
    reinterpret_cast< void(*)( const char* ) >( array[1] )( "Hello, world!" );
}
Run Code Online (Sandbox Code Playgroud)

当然,如果通过指向不同类型函数的指针调用函数,则会丢失很多类型安全性,并且会有未定义的行为.