implicit conversion

uri via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Tue Aug 12 00:00:25 PDT 2014


On Tuesday, 12 August 2014 at 06:37:45 UTC, Jonathan M Davis via 
Digitalmars-d-learn wrote:
> On Tue, 12 Aug 2014 06:21:17 +0000
> uri via Digitalmars-d-learn <digitalmars-d-learn at puremagic.com> 
> wrote:
>
>> Hi,
>>
>> I'm trying to allow implicit conversions for my own type
>> happening. I have the following:
>>
>> ----
>> import std.math;
>> import std.traits;
>>
>> struct S(T)
>> if(isFloatingPoint!T)
>> {
>>      T val;
>>      alias val this;
>> }
>> void main()
>> {
>>
>>      auto s = S!float();
>>      assert(isNaN(s));
>>      s = 10.0;
>>      assert(!isNaN(s));
>> }
>> ----
>>
>> But I get a compile time error:
>>
>> ----
>> Error: template std.math.isNaN cannot deduce function from
>> argument types !()(S!float), candidates are:
>>
>> std/math.d(4171):        std.math.isNaN(X)(X x) if
>> (isFloatingPoint!X)
>> ----
>>
>> Is there a way I can to do this, maybe opCall/opCast (I tried
>> these but failed)?
>
> The problem is that isNaN is now templatized, and its 
> constraint uses
> isFloatingPoint, which requires that the type _be_ a floating 
> point type, not
> that it implicitly convert to one. So, as it stands, isNAN 
> cannot work with
> any type which implicitly converts to a floating point value. 
> Either it will
> have to be instantiated with the floating point type - e.g. 
> isNaN!float(s) -
> or you're going to have to explicitly cast s to a floating 
> point type.
>
> You can open a bug report - https://issues.dlang.org - and mark 
> it as a
> regression, and it might get changed, but the reality of the 
> matter is that
> templates don't tend to play well with implicit conversions. 
> It's _far_ too
> easy to allow something in due to an implicit conversion and 
> then have it not
> actually work, because the value is never actually converted. 
> In general, I
> would strongly advise against attempting to give types implicit 
> conversions
> precisely because they tend to not play nicely with templates.
>
> - Jonathan M Davis

Thanks for the info. I'm happy to change my code and remove the 
implicit conversion. It was just for a convenience factor (floats 
with accumulated error).


Cheers,
uri



More information about the Digitalmars-d-learn mailing list