我需要一个地方来交替容纳对象和函数指针。使用void *
和void (*)(void)
的并集是一种便携式解决方案吗?
union GenericPtr {
void *obj_ptr;
void (*fun_ptr)(void);
};
extern int *x, fn(void);
union GenericPtr ptr1, ptr2;
ptr1.obj_ptr = (void *) x;
ptr2.fun_ptr = (void (*)(void)) fn;
答案 0 :(得分:2)
是否使用
void *
和void (*)(void)
的联合便携式解决方案?
它用于指向对象或不是非静态成员函数的函数。请注意,您可能想使用std::variant
来节省很多此联合所需的样板代码。
这确实确实省略了指向成员的指针,这些成员并不是严格意义上的“指针”,但通常仍称为“指针”。由于这些类型与类一样多,因此不能使用联合来指向所有它们。
也可以通过附加的间接访问来实现足够通用的指向成员的指针:指向存储器块的void*
指针,其中包含必需的任何类型的指针。标准库中有一种类型:std::any
(不限于保存任何指针,实际上是任何类型的对象,包括任何指针)。