我有一个包含很多(比如数百个)指针的结构。每个指针都是不同的类型,但它们都继承自一个公共基类 --- 我们称它为 Base。我正在使用多重继承。(这都是机器生成的,这就是为什么它很奇怪。)
例如:
class Data {
Class1* p1;
Class2* p2;
Class3* p3;
...etc...
};
我想在所有这些上调用 Base 中定义的方法。我可以生成这样的代码:
void callFooOnData(Data* p)
{
if (p1) p1->Foo();
if (p2) p2->Foo();
if (p3) p3->Foo();
...etc...
}
问题是,我有很多很多,十亿种不同的数据,上面的代码最终变得非常大,影响了我的足迹。所以我试图用更聪明的东西来代替它。
在 C 中,我可以简单地获取第一个结构成员的地址和计数,然后执行以下操作:
void callFooOnData(Data* p)
{
callFooOnObjects(&p1, 3);
}
但是,当然,我不能在 C++ 中这样做,因为结构成员不是统一类型,将它们转换为 Base* 可能涉及更改它们,这可能涉及更改指针,因为它们不是一个统一类型的指针将不得不为每个成员进行不同的更改,我不能这样做。
有没有办法做这样的事情是C++?这都是机器生成的代码,所以它不必很漂亮,谢天谢地——鲨鱼已经被跳过了——但我确实需要它尽可能便携......
(我确实可以访问 RTTI,但出于性能原因,我想尽可能避免使用它。)
更新:
所以,据我所知......你不能在 C++ 中做到这一点。根本做不到。我被它在 C 中完全简单的事实误导了。在 C++ 中,如果你有一个类型良好的指针开始,你只能安全地在类层次结构中的两种类型之间转换一个指针,当然,我没有。
所以我将不得不改变潜在的问题以避免这种情况:我提出的解决方案是将结构中的每个指针存储两次,一次在 Base* 数组中进行迭代,一次作为 ClassWhatever * 用于调用方法。当然,这很糟糕,因为它会使数据结构的大小增加一倍。
因此,如果有人想确认这一点(我很想被证明是错误的),我很乐意将他们的答案标记为正确......