【发布时间】:2020-11-20 17:30:49
【问题描述】:
这是我要简化的功能:
void BaseCharacter::ClimbLadder(float AxisValue)
{
if (AxisValue > 0.f)
ClimbUpLadder<bIsClimbingLaddersFast>();
else if (AxisValue < 0.f)
ClimbDownLadder<bIsClimbingLaddersFast>();
}
bIsClimbingLaddersFast 是一个布尔成员变量。现在,代码无法编译,因为需要在编译时知道布尔值。这是简单的解决方案:
void BaseCharacter::ClimbLadder(float AxisValue)
{
if (bIsClimbingLaddersFast)
{
if (AxisValue > 0.f)
ClimbUpLadder<true>();
else if (AxisValue < 0.f)
ClimbDownLadder<true>();
}
else
{
if (AxisValue > 0.f)
ClimbUpLadder<false>();
else if (AxisValue < 0.f)
ClimbDownLadder<false>();
}
}
但我想知道是否有一种更简洁的方法来编写这个,没有重复的 if-else 语句。 正在使用 C++14。
【问题讨论】:
-
你能把布尔值作为参数而不是模板参数传递给函数吗?
-
就我个人而言,我会将
ClimbUpLadder和ClimbDownLadder从作为模板更改为采用 bool 参数。然后你可以有if (AxisValue > 0.f) ClimbUpLadder(bIsClimbingLaddersFast); else if (AxisValue < 0.f) ClimbDownLadder(bIsClimbingLaddersFast); -
您对
AxisValue == 0.0f没有任何操作是故意的吗? -
好的,很高兴知道。我认为这可能会对答案产生影响。
-
无论您应用什么技巧,您都需要以某种方式从运行时值映射到编译时值。 Nathans 解决方案使调用者更干净,而您的解决方案将映射放在调用者身上,选择你的毒药。如果你在编译时从不知道
bIsClimbingLaddersFast,为什么它首先是一个模板参数?
标签: c++ templates constants c++14 compile-time-constant