求教如何在 C++中优雅地实现在 C 中的 void *所能实现的部分功能

查看 82|回复 4
作者:shizukupr   
目前手上有一个将用 C 实现的科学计算程序重写为 C++实现的任务,需要将其中大量的 C 风格实现改为 OOP 风格实现,但是目前遇到了一些实现上的问题
原始程序中使用struct维护一个全局计算数据结构,所有的计算 kernel 又会单独使用一系列的struct来维护每个 kernel 所需要的参数。这些 kernel 参数结构体在用于保存全局计算的结构体中使用了void *进行管理,然而在迁移到 C++的过程中要求不能使用void *,故问一问各位大佬如何在 C++中优雅且低成本地实现类似void *的功能
在原始的程序中,全局计算结构体存在这样的成员
typedef struct {
// ...
void *something[N];

// ...
} GlobalStruct;
其中这个void *可能对应多个不同的结构体,各个结构体之间相互有不同的成员,例如
typedef struct {
        int a;
    int b;
    short c;
} A;
typedef struct {
        int a;
    int b;
    double d;
} B;
typedef struct {
        int a;
    int b;
} C;
void kernel_A(A *data);
void kernel_B(B *data);
void kernel_C(C *data);
请问有什么方法可以在 C++程序中实现在上面void *的效果。

void, struct, int, typedef

exch4nge   
一般解法:继承+虚函数,不知道你这个场景能否承担相应开销
pocarisweat   
如果是这些结构体数据成员不同,但要实现相似(但不相同)的行为,可以用继承搭配虚函数。
如果是单纯想把不一样的数据存在一起,可以用 std::variant (C++17).
如果这些数据逻辑上不需要统一管理,放在一起只是为了复用代码,那可以考虑引入模板,然后不同类型各管各的,利用模板复用同一套代码。
codehz   
https://en.cppreference.com/w/cpp/utility/variant
把所有可能的类型都写上去
然后处理函数可以做成重载,或者用 https://en.cppreference.com/w/cpp/utility/variant/visit 里提示的 overloaded 方法
leonshaw   
有共性就继承,没有就 std::any ,直接用 void* 也没啥不行的。
您需要登录后才可以回帖 登录 | 立即注册

返回顶部