generic + numeric + literals = abomination

bearophile bearophileHUGS at lycos.com
Sat Mar 27 13:21:46 PDT 2010


so:
> With this in mind, just one thing bugs me.
> 
> ----
> import std.stdio;
> 
> struct vector(T) {
> 	this(T m) { mm = m; }
> 	vector!T opBinary(string s)(T m) if(s=="*") {
> 		return vector!T(mm * m);
> 	}
> 	T mm;
> }
> 
> void test(T)() {
> 	vector!T v = vector!T(0.5);
> 	vector!T u = v * 0.3;
> 	writeln("u: ", u.mm);
> }
> 
> void main() {
> 	test!float();
> 	test!double();
> 	test!real();
> }
> -----
> 
> This program compiles and runs just fine, but i feel dirty, you see I  
> explicitly stated that opBinary takes a variable of type T,
> but it accepted 0.3 on all 3 tests, implicitly casted double to T. In C++  
> world this brings tons of trouble, especially performance problems,
> but here i am not sure what DMD does that there :)

Are you trying to do this?

import std.stdio: writeln;

struct Vector(T) {
    this(T m) { mm = m; }
    Vector opBinary(string op:"*", T2)(T2 m) if(is(T2 == T)) {
        return Vector(mm * m);
    }
    T mm;
}

void test(T)() {
    Vector!T v = Vector!T(0.5);
    Vector!T u = v * 0.3;
    writeln("u: ", u.mm);
}

void main() {
    //test!float();
    test!double();
    //test!real();
}

Bye,
bearophile


More information about the Digitalmars-d-learn mailing list