繁体   English   中英

模板signum的解释

[英]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=>1False=>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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM