Lingxi
Lingxi

Reputation: 14977

Template version of std::abs

Here lists the current overloads of std::abs in C++. I'm wondering why not just define the following template and let go all the ugly C-style overloads?

template <typename T> inline
T abs(const T& v) { return v < 0 ? -v : v; }

Upvotes: 26

Views: 7002

Answers (3)

MSalters
MSalters

Reputation: 179907

See LWG issue 2192. Currently, std::abs(x-y) < 2 fails if x and y are unsigned. This catches a subtle programming error. With the proposed change, it compiles but does entirely the wrong thing. abs(3u-4u) would be much larger than 2, in fact it's UINT_MAX.

Upvotes: 22

user1084944
user1084944

Reputation:

This suffers the usual problem of matching everything.

An example of a type for which abs makes sense but this implementation does not is complex<double>.

Upvotes: 11

Nihar
Nihar

Reputation: 355

Because type 'T' can access any data type including char. So what are you expecting if someone will pass a char to the abs function. :)

Upvotes: 0

Related Questions