我的钳位宏问题

Dog*_*Dog 2 c++ macros clamp

我的钳位宏有问题,当我的值超过10且我的高超过17时,它停止工作.任何的想法?

#define CLAMP(value, low, high) (((value)<(low))?(low):(((value)>(high))?(high):(value)))
Run Code Online (Sandbox Code Playgroud)

Kar*_*nek 15

我建议使用比宏更安全的方式:

template <typename T> T CLAMP(const T& value, const T& low, const T& high) 
{
  return value < low ? low : (value > high ? high : value); 
}
Run Code Online (Sandbox Code Playgroud)

  • @Beta:标准的`std :: max()`使用单一类型,而不是你建议的三种类型.在某些时候,Alexandrescu写了完整的*正确*类型安全版本的C宏`#define MAX(x,y)((x)>(y)?(x):( y))`in"only"174代码行.标准委员会认为`std :: min`模板存在的问题(要求两个参数属于同一类型,如果参数属于不同类型则失败)不值得Alexandrescu提议所需的更改.有时简单的方法就足够了. (5认同)
  • 到目前为止,这是最好的答案.Nit:所有大写名称都应保留给宏.干杯, (3认同)
  • +1,但我建议`template <typename V,typename L,typename H>` (2认同)
  • 没有理由在模板函数中打包if-else语句.否则为+1(我个人不会将函数命名为全部大写,因为它取代了函数中的宏). (2认同)