
Boost : 
From: Thorsten Ottosen (nesotto_at_[hidden])
Date: 20040302 03:21:24
"Daniel Frey" <daniel.frey_at_[hidden]> wrote in message
news:c1vlqp$90l$1_at_sea.gmane.org...
Thorsten Ottosen wrote:
[snip]
>It depends on what exactly you tried. The basic problem is, that T(pi)
>tries to call a ctor for T, but std::complex has several candidates
>available. std::complex<double>(std::complex<double>) and
>std::complex<double>(double) might conflict here, except you don't
>provide conversion to std::complex<double> for your constants. But you
>cannot assume this for other UDT. What happens if a UDT has ctors taking
>float, double and longdouble? You can't use your constants any more,
>even a new conversion to the type directly won't help.
Sorry, but I don't get this.
complex<float> z = float( pi );
should work just fine.
> Why
>shouldn't this scale to pi*pi*t? Or sqrt(pi)*t. The first nonconstant
>should select the type, no matter how the constants are used before.
Yeah, I could let pi * pi return a two_pi object.
>> Doesn't work well with unit libraries AFAICS (again not scaling well)
> how?
>>>From your example file:
>>
>> std::cout << pi.get< float >() << std::endl;
>>
>> which is float( pi ) spelt more elaborate.
>
>As mentioned, this is a very important thing to note that .get<T> is
>free to return something else than T!
maybe not the best way to spell the function then?
> std::cout << sqrt( sqrt( two + pi ) ) + d << std::endl;
>
> will everything left of d be a constant? If so, what would the point be?
>Basically, it's not a single constant. The constants are both casts to
>d's type, added and sent through sqrt two times. But you can  if you
>want to  make it a single, fast constant if you think it's worth the
>effort for your program.
ok. I can see that my approach might not scale too well.
br
Thorsten
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk