This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH] C++ math constants


> > How about the attached file as a start for <ext/math>.  I used the
> > constexpr approach (instead of function calls) and replicated the
> > constants that are available in <math.h> in Unix.

then this should really be 

ext/cmath

> 
> 1) In this case I miss the corresponding variable definitions, because
> you violate the ODR, when you have something like the following:
> 
> #include <iostream>
> 
> template<class T>
> void print(const T& t) { std::cout << t; }
> 
> int main() {
>   print(__math_constants<double>::__pi);
> }

Not seeing it.

Say for:

#include <iostream>

  // A class for math constants.
  template<typename _RealType>
    struct __math_constants
    {
      // Constant @f$ \pi @f$.
      static constexpr _RealType __pie =
  3.1415926535897932384626433832795029L; };

template<class T>
void print(const T& t) { std::cout << t; }

int main() 
{
  print(__math_constants<double>::__pie);
  return 0;
}

I'm not getting any definition, even at -O0.

Any chance you could expand on your thinking here Daniel?


> 2) You need to use either braced initializers *or* using initializers
> with equal, a parenthesized initializer isn't supported
> (/brace-or-equal-initializer/).

Yeah. This works:

 // Constant @f$ \pi @f$.
 static constexpr _RealType __pie =
 3.1415926535897932384626433832795029L;


-benjamin


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]