我现在有一个C++接口转换切换至非虚拟多态性
void foo() ...
和大量implementions的
void A::foo();
void B::foo();
目前foo的定义如下
struct Wrapper
{
void foo()
{
if(state == STATE_A) a.foo();
else if(state == STATE_B) b.foo();
}
union {
A a;
B b;
};
State state;
}
//....
Wrapper a(STATE_A, existingA);
Wrapper b(STATE_B, existingB);
a.foo(); b.foo();
是否有干净的方式来做到这一点?我有多个foo()函数和多个A/B类。它变得单调乏味/容易出错写所有的情况。
请注意,我不能使用虚函数(它运行在N^5循环内......每秒执行1000万次执行)。我希望编译器内联这个,很难。
我曾想过收集的公司,B公司等一起,在一个面向数据的方式计算它们,但不幸的是我不能做到这一点(由于算法问题)
'它变得单调乏味/容易出错写出所有的情况。'这就是当你放弃语言特性并选择直接编码时发生的情况。这就是为什么这些语言特征首先存在:因为有人厌倦了写出样板。 –
要添加,这比使用虚拟调度更好吗?即使这是使用索引(如数组查询)而不是if-else链进行优化的,这相当于使用虚拟调度(就大多数编译器而言)。也就是说,STATE_X代表一个vtable,而Wrapper :: foo就像vtable查找一样...... –
你真的用虚拟函数测量了简单的实现吗? 3-5“如果”条件可以很容易地匹配虚拟功能调用的成本。并且不能保证内联真的发生如果功能增长足够大... –