[英]Explanation for template signum
我遇到了这个C ++模板
template <typename T> int sgn(T val) {
return (T(0) < val) - (val < T(0));
}
而且我必须承认我并没有真正理解它。 如果我尝试做一个数字应用程序,让我们说-1:(0 <( - 1)) - ( - 1 <0)=> False - 真我得到一个Bool的减法。 它是如何工作的? 有人能解释一下编译器会做的不同步骤吗?
那里发生了隐式转换: True=>1
且False=>0
。
您需要检查两个条件以查看该值是否等于零 - 这就是signum的定义方式。 如果您只想检查大于或小于0,那么您可以通过单一比较来逃避。
尽管如此,让你的示例为-1
和发布的模板,结果你得到:
return False - True;
=> return 0 - 1;
=> return -1;
如果为0,则返回-1,如果0为0,则返回-1:
(T(0) < val) - (val < T(0))
0<-1 false or 0
-
-1 < 0 true or 1
0 - 1 = -1
我敢说0
(T(0) < val) - (val < T(0))
0<0 false or 0
-
0 < 0 false or 0
0 - 0 = 0
让我们说1:
(T(0) < val) - (val < T(0))
0<1 true or 1
-
1 < 0 false or 0
1 - 0 = 1
false和true将转换为0和1.因此,如果一个或两个表达式求值为false,则得到-1,0,1个结果。 这是signum函数的正典定义。
PS.Thats不是一个有效的模板,为了更好的工作,应该有三个专业。
这个问题的特点是解释了这些问题: C / C ++中是否有标准符号函数(signum,sgn)?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.