tony497
tony497

Reputation: 400

Explanation for template signum

I came across this template of C++

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

And I have to admit I don't really get it. If I try to do a numeric application, let's say -1: (0<(-1))-(-1 < 0) => False - True I get a subtraction of Bool. Is that how it should work? Can someone explain the different steps the compiler will do?

Upvotes: 3

Views: 621

Answers (3)

Dusteh
Dusteh

Reputation: 1536

There are implicit conversions happening there: True=>1 and False=>0.

You need to check both conditions to see if the value could be equal to zero - that's how signum is defined. If your interested in checking only greater or lower than 0, you could get away with a single comparison.

Nevertheless, having your example with -1 and the posted template, in result you get:

return False - True; => return 0 - 1; => return -1;

Upvotes: 1

Ch1v1
Ch1v1

Reputation: 121

It will return-1 if negative +1 if possitive 0 if 0 lets say -1:

(T(0) < val) - (val < T(0))
0<-1 false or 0
-
-1 < 0 true or 1
0 - 1  = -1

lets say 0

(T(0) < val) - (val < T(0))
0<0 false or 0
-
0 < 0 false or 0
0 - 0  = 0

lets say 1:

(T(0) < val) - (val < T(0))
0<1 true or 1
-
1 < 0 false or 0
1 - 0  = 1

Upvotes: 1

Swift - Friday Pie
Swift - Friday Pie

Reputation: 14589

false and true would be converted to 0 and 1. So depending if one or both expressions evaluate to false, you get -1, 0, 1 results. That's a canon definition of signum function.

PS.Thats not an effective template, for better work there should be three specializations.

This question features answer that explains those: Is there a standard sign function (signum, sgn) in C/C++?

Upvotes: 0

Related Questions