【问题标题】:Branching out templated code based on a non const bool基于非 const bool 分支模板化代码
【发布时间】: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。

【问题讨论】:

  • 你能把布尔值作为参数而不是模板参数传递给函数吗?
  • 就我个人而言,我会将 ClimbUpLadderClimbDownLadder 从作为模板更改为采用 bool 参数。然后你可以有if (AxisValue &gt; 0.f) ClimbUpLadder(bIsClimbingLaddersFast); else if (AxisValue &lt; 0.f) ClimbDownLadder(bIsClimbingLaddersFast);
  • 您对AxisValue == 0.0f没有任何操作是故意的吗?
  • 好的,很高兴知道。我认为这可能会对答案产生影响。
  • 无论您应用什么技巧,您都需要以某种方式从运行时值映射到编译时值。 Nathans 解决方案使调用者更干净,而您的解决方案将映射放在调用者身上,选择你的毒药。如果你在编译时从不知道bIsClimbingLaddersFast,为什么它首先是一个模板参数?

标签: c++ templates constants c++14 compile-time-constant


【解决方案1】:

一个可能的(完全未经测试的代码)解决方案。

template<bool climb>
void BaseCharacter::ClimbLadder(float AxisValue) {
    if (AxisValue > 0.f)
        ClimbUpLadder<climb>();
    else if (AxisValue < 0.f)
        ClimbDownLadder<climb>();
}

void BaseCharacter::ClimbLadder(float AxisValue) {
    if (bIsClimbingLaddersFast)
        ClimbLadder<true>(AxisValue);
    else
        ClimbLadder<false>(AxisValue);
} 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多