Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 基于非常量布尔分支出模板化代码_C++_Templates_Constants_C++14_Compile Time Constant - Fatal编程技术网

C++ 基于非常量布尔分支出模板化代码

C++ 基于非常量布尔分支出模板化代码,c++,templates,constants,c++14,compile-time-constant,C++,Templates,Constants,C++14,Compile Time Constant,这是我试图简化的函数: void BaseCharacter::ClimbLadder(float AxisValue) { if (AxisValue > 0.f) ClimbUpLadder<bIsClimbingLaddersFast>(); else if (AxisValue < 0.f) ClimbDownLadder<bIsClimbingLaddersFast>(); } void BaseCh

这是我试图简化的函数:

void BaseCharacter::ClimbLadder(float AxisValue)
{
    if (AxisValue > 0.f)
        ClimbUpLadder<bIsClimbingLaddersFast>();
    else if (AxisValue < 0.f)
        ClimbDownLadder<bIsClimbingLaddersFast>();
}
void BaseCharacter::爬梯(浮点值)
{
如果(AxisValue>0.f)
加法器();
else if(AxisValue<0.f)
爬下梯子();
}
BISCALLINGLADDERSFAST是一个布尔成员变量。现在,代码不会编译,因为需要在编译时知道布尔值。这是一个简单的解决方案:

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>();
    }
}
void BaseCharacter::爬梯(浮点值)
{
if(双爬梯快速)
{
如果(AxisValue>0.f)
加法器();
else if(AxisValue<0.f)
爬下梯子();
}
其他的
{
如果(AxisValue>0.f)
加法器();
else if(AxisValue<0.f)
爬下梯子();
}
}
但是我想知道是否有一种更干净的方法来写这个,一种没有重复if-else语句的方法。 正在使用C++14。

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

模板
void BaseCharacter::爬梯(浮点值){
如果(AxisValue>0.f)
加法器();
else if(AxisValue<0.f)
爬下梯子();
}
void BaseCharacter::爬梯(浮点值){
if(双爬梯快速)
爬梯(轴值);
其他的
爬梯(轴值);
} 

能否将布尔值作为参数而不是模板参数传递到函数中?就我个人而言,我会将
grampupladder
grampdownloadder
从模板改为采用布尔参数。然后您可以使用
if(AxisValue>0.f)grampupladder(biscomplingladdersfast);否则,如果(AxisValue<0.f)爬下阶梯(BisClimpingLaddersFast)
您是否有意对
AxisValue==0.0f
不执行任何操作?好的,很高兴知道。我认为这可能会使答案有所不同。无论你采用什么技巧,你都需要以某种方式从运行时值映射到编译时值。Nathans解决方案使调用方更加干净,而您的解决方案将映射放置在调用方上,请选择您的毒药。如果在编译时您永远不知道bisclingladdersfast,为什么它首先是一个模板参数?