objective-c – 如何写一个’clamp’/’clip’/’bound’宏来返回给定范围内的值?

我经常发现自己在写东西
int computedValue = ...;
return MAX(0,MIN(5,computedValue));

我想把它写成一个单行宏.它必须没有副作用,与现有的系统宏MIN和MAX相同,并且应适用于与MIN和MAX相同的数据类型.

有谁能告诉我如何把它变成一个宏?

解决方法

这是没有副作用,适用于任何原始数字:
#define MIN(A,B)    ({ __typeof__(A) __a = (A); __typeof__(B) __b = (B); __a < __b ? __a : __b; })
#define MAX(A,B)    ({ __typeof__(A) __a = (A); __typeof__(B) __b = (B); __a < __b ? __b : __a; })

#define CLAMP(x,low,high) ({\
  __typeof__(x) __x = (x); \
  __typeof__(low) __low = (low);\
  __typeof__(high) __high = (high);\
  __x > __high ? __high : (__x < __low ? __low : __x);\
  })

可以这样使用

int clampedInt = CLAMP(computedValue,3,7);
double clampedDouble = CLAMP(computedValue,0.5,1.0);

其他建议的名称而不是CLAMP可以是VALUE_CONSTRAINED_LOW_HIGH,BOUNDS,CLIPPED.

相关文章

对象的传值与返回说起函数,就不免要谈谈函数的参数和返回值...
从实现装饰者模式中思考C++指针和引用的选择最近在看...
关于vtordisp知多少?我相信不少人看到这篇文章,多半是来自...
那些陌生的C++关键字学过程序语言的人相信对关键字并...
命令行下的树形打印最近在处理代码分析问题时,需要将代码的...
虚函数与虚继承寻踪封装、继承、多态是面向对象语言的三大特...