Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 模板符号说明_C++_Templates - Fatal编程技术网

C++ 模板符号说明

C++ 模板符号说明,c++,templates,C++,Templates,我遇到了这个C的模板++ template <typename T> int sgn(T val) { return (T(0) < val) - (val < T(0)); } template int sgn(T val){ 返回值(T(0)0 您需要检查这两个条件,以查看值是否可以等于零-这就是signum的定义。如果您只想检查大于或小于0的值,则只需进行一次比较即可 尽管如此,如果您使用-1示例和发布的模板,您将得到: 返回False-T

我遇到了这个C的模板++

template <typename T> int sgn(T val) {
        return (T(0) < val) - (val < T(0));
    }
template int sgn(T val){
返回值(T(0)
我得承认我真的不明白。 如果我尝试做一个数值应用程序,比如-1: (0假-真我得到布尔的减法。
这就是它的工作原理吗?有人能解释一下编译器将执行的不同步骤吗?

false和true将被转换为0和1。因此,根据一个或两个表达式的计算结果是否为false,您将得到-1,0,1结果。这是signum函数的canon定义

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

这个问题的答案解释了以下几点:
那里发生了隐式转换:
True=>1
False=>0

您需要检查这两个条件,以查看值是否可以等于零-这就是signum的定义。如果您只想检查大于或小于0的值,则只需进行一次比较即可

尽管如此,如果您使用
-1
示例和发布的模板,您将得到:


返回False-True;
=>
返回0-1;
=>
返回-1;

如果为负,则返回-1;如果为正,则返回0如果为0 让我们说-1:

(T(0) < val) - (val < T(0))
0<-1 false or 0
-
-1 < 0 true or 1
0 - 1  = -1
(T(0)0在那里得到一个隐式转换。False=>0,True=>1。因此得到
返回0-1
(T(0) < val) - (val < T(0))
0<0 false or 0
-
0 < 0 false or 0
0 - 0  = 0
(T(0) < val) - (val < T(0))
0<1 true or 1
-
1 < 0 false or 0
1 - 0  = 1