gpt4 book ai didi

c++ - 删除虚拟继承

转载 作者:行者123 更新时间:2023-11-27 23:29:51 25 4
gpt4 key购买 nike

我正在开发一个嵌入式项目,我正在尝试删除已实现 +/- * 的虚拟数字类。删除此类可以节省大量代码空间,因此我将 + 替换为以下函数,

if (BASE(h)->type() == FLOAT && BASE(v)->type() == FLOAT)
{
res = FLOAT(h)->floatValue() + FLOAT(v)->floatValue();
}
else if (BASE(h)->type() == INTEGER && BASE(v)->type() == INTEGER)
{
res = INTEGER(h)->intValue() + INTEGER(v)->intValue();
}
else if (BASE(h)->type() == INTEGER && BASE(v)->type() == FLOAT)
{
res = INTEGER(h)->floatValue() + FLOAT(v)->floatValue();
}
else
{
res = FLOAT(h)->floatValue() + INTEGER(v)->floatValue();
}

有没有更简单的方法来实现这个目标?因为我必须对其他操作和比较使用相同的方案?

最佳答案

#define GETFLOAT(arg) (BASE(arg)->type() == INTEGER ? INTEGER(arg)->floatValue() : FLOAT(arg)->floatValue())

switch(BASE(h)->type()) {
case INTEGER:
if (BASE(v)->type() == INTEGER) {
res = INTEGER(h)->intValue() + INTEGER(v)->intValue();
break;
}
case FLOAT:
res = GETFLOAT(h) + GETFLOAT(v);
}

这实际上在 h 的类型上分支了两次,但只有在(你在其他地方的评论中说)昂贵的情况下,浮点操作。您可以使用 goto 来避免这种情况,但我不会再讨论这个问题了。像这样的东西:

switch(BASE(h)->type()) {
case INTEGER:
if (BASE(v)->type() == INTEGER) {
res = INTEGER(h)->intValue() + INTEGER(v)->intValue();
goto finished; // or better: return res;
}
hvalue = INTEGER(h)->floatValue()
break;
case FLOAT:
hvalue = FLOAT(h)->floatValue();
}
res = hvalue + GETFLOAT(v);
finished:

与霍华德的回答一样,如果 BASE()type() 很昂贵,那么您可以为每个参数计算一次答案,即使它被使用了两次。

关于c++ - 删除虚拟继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6217021/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com