如何将各种类型的函数指针存储在一起?
可以使用通用void*
存储正常指针。 例如
void* arr[10]; arr[0] = pChar; arr[1] = pINt; arr[2] = pA;
不久之后,我遇到了一个讨论, void*
可能无法在所有平台(例如64位及更多)中存储没有数据丢失的函数指针。 我不确定这个事实。
如果这是真的,那么存储函数指针集合的最便携方式是什么? [注意: 这个问题没有令人满意地回答这个问题。]
编辑 :我将使用索引存储此函数指针。 每当访问此集合时,都会对每个索引进行类型转换。 截至目前,我只对制作数组或vector
感兴趣。]
您可以将函数指针转换为任何函数类型的另一个函数指针,然后返回而不会丢失。
因此,只要通过函数指针进行调用,首先将其类型转换回正确的类型,就可以将所有函数指针存储在以下内容中:
typedef void (*fcn_ptr)(void); // 'generic' function pointer fcn_ptr arr[10];
可以使用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(a) , reinterpret_cast(b) }; int test = reinterpret_cast< int(*)( int, double) >( array[0] )( 5, 0.5 ); reinterpret_cast< void(*)( const char* ) >( array[1] )( "Hello, world!" ); }
当然,如果通过指向不同类型函数的指针调用函数,则会丢失很多类型安全性,并且会有未定义的行为 。
使用函数指针类型的并集,这在C和C ++中都有效,并确保指针有足够的存储空间(可能大小相同,仍然……)
有一些东西组成了函数指针的类型。
- 代码的内存地址
- 参数签名
- 联动/名称修改
- 呼召惯例
- 对于成员函数, 还有其他一些东西
如果这些function在您的函数指针中不一致,那么您无法将它们明智地存储在同一个容器中。
但是,您可以将不同的方面绑定到std::function
,这是一个可调用的对象,只需要参数签名和返回类型是统一的。
现在可能是在虚拟function方面重新思考问题的好时机。 这个函数指针的混搭是否具有可以表达的连贯接口? 如果没有,那么你无论如何都注定了:-)
RE:Hasturkun,你可以在工会中存储异构函数指针,是的,它们只是POD,但你还需要存储有关它的指针类型的信息,以便你可以选择要调用的正确成员。 这有两个问题:
- 有一个项目开销,
- 你必须手动检查你是否一直在使用正确的,这是非本地效应的负担 – 它是一种传播毒药。
最好每个类型有一个容器,它将澄清代码并使其更安全。 或者,使用诸如std::function
类的代理使它们具有相同的类型。