Re: Help with g++ 6 abs() and templates

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Sat, Feb 20, 2016 at 10:35:06AM +0000, Jonathan Wakely wrote:
> On 20/02/16 03:32 +0000, Jonathan Wakely wrote:
> >On 19/02/16 20:18 -0700, Orion Poplawski wrote:
> >>octave has template functions that call abs() on templated
> >>variables, something like:
> >>
> >>template <class T>
> >>T myfunc(T arg) {
> >>T x = abs(arg);
> >>}
> >>
> >>
> >>This leads to errors when instantiated for unsigned types
> >>because abs(unsigned type) is not defined as is doesn't make
> >>sense to do.
> >>That's fine and all, but how then does one write generic
> >>template code as above that works for signed and unsigned types.
> >
> >
> >template <class T>
> >typename std::enable_if<std::is_signed<T>::value, T>::type
> >generic_abs(T arg) {
> >  return abs(arg);
> >}
> >
> >template <class T>
> >typename std::enable_if<!std::is_signed<T>::value, T>::type
> >generic_abs(T arg) {
> >  return arg;
> >}
> >
> >template <class T>
> >T myfunc(T arg) {
> >  T x = generic_abs(arg);
> >}
> 
> Or maybe better, figure out which version of abs() it used to call
> before the GCC 6 changes, which was probably abs(int), and just cast
> to that.
> 
> If it worked before without an overloaded abs() then implicitly
> converting to int must have been OK (or a lurking bug). So just:
> 
> template <class T>
> T myfunc(T arg) {
> T x = abs((int)arg);
> }

Or define

unsigned abs(unsigned x) { return x; } ?

Zbyszek
--
devel mailing list
devel@xxxxxxxxxxxxxxxxxxxxxxx
http://lists.fedoraproject.org/admin/lists/devel@xxxxxxxxxxxxxxxxxxxxxxx




[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Fedora Announce]     [Fedora Kernel]     [Fedora Testing]     [Fedora Formulas]     [Fedora PHP Devel]     [Kernel Development]     [Fedora Legacy]     [Fedora Maintainers]     [Fedora Desktop]     [PAM]     [Red Hat Development]     [Gimp]     [Yosemite News]
  Powered by Linux