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它.
您可以将函数指针转换为任何函数类型的另一个函数指针,然后返回而不会丢失.
因此,只要通过函数指针进行调用,首先将其类型转换回正确的类型,就可以将所有函数指针存储在以下内容中:
typedef void (*fcn_ptr)(void); // 'generic' function pointer
fcn_ptr arr[10];
Run Code Online (Sandbox Code Playgroud)
可以将指向函数的指针转换为指向具有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)
当然,如果通过指向不同类型函数的指针调用函数,则会丢失很多类型安全性,并且会有未定义的行为.