Works in dmd  2.059 too.

[code]
T template_cast(T : Object, U : Object)(U value) {
        // try to convert
        T val = cast(T) value;
        
        // if convert was successful, return
        if (val !is null) {
                return val;
        }
        
        // if cast fails it is a template class
    static if (is(T ClassType : V!W, alias V, W)) {
        // V is the template class
                import std.typetuple;
                
                // find out which one is "value"'s original type
foreach (Type; TypeTuple!(byte, ubyte, short, ushort, int, uint, long, ulong, float, double, real)) {
                        // if found: cast
                        writeln(Type.stringof);
                        if (auto vec = cast(V!Type) value) {
                                return cast(Unqual!T) vec;
                        }
                }
                
                return null;
    } else {
                return null;
        }
}
[/code]

Example:
[code]
class Rect(T) {
        T opCast(T : inout(Rect!U), U)() inout {
                return new T();
        }
        
        override string toString() const {
                return "Rect!(" ~ T.stringof ~ ")";
        }
}

void foo(Object o) {
        write("O ist: ");
        writeln(o);
        
        write("self cast: ");
        writeln(cast(Rect!int) o);
        
        write("template cast: ");
        Rect!int ri = template_cast!(Rect!int)(o);
        
        write("Result: ");
        writeln(ri);
}

Rect!(float) rf = new Rect!(float)();

foo(rf);
[/code]

Reply via email to