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,为什么它首先是一个模板参数?