模板签名

时间:2018-04-03 09:22:11

标签: c++ templates

我遇到了这个C ++模板

template <typename T> int sgn(T val) {
        return (T(0) < val) - (val < T(0));
    }

而且我必须承认我并没有真正理解它。 如果我尝试做一个数字应用程序,让我们说-1: (0 <( - 1)) - ( - 1 <0)=&gt;错 - 真的我得到了Bool的减法。 它是如何工作的?有人能解释一下编译器会做的不同步骤吗?

3 个答案:

答案 0 :(得分:1)

有隐含的转化:True=>1False=>0

您需要检查两个条件以查看该值是否等于零 - 这是如何定义signum的。如果您只想检查大于或小于0,那么您可以通过单一比较来实现。

尽管如此,让您的示例包含-1和发布的模板,结果是:

return False - True; =&gt; return 0 - 1; =&gt; return -1;

答案 1 :(得分: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

答案 2 :(得分:0)

false和true将转换为0和1.因此,如果一个或两个表达式的计算结果为false,则得到-1,0,1个结果。这是signum函数的正典定义。

PS.Thats不是一个有效的模板,为了更好的工作,应该有三个专业。

这个问题的特点是解释这些问题: Is there a standard sign function (signum, sgn) in C/C++?