Interesting. I think in the second example there are pathological cases where one has similar declarations in two modules at the same line.

moduleA.d:100
alias dollars_t TypeDef!int;
moduleB.d:100
alias cents_t TypeDef!int;

main.d:
import moduleA;
import moduleB;
void write_dollars_to_database(dollars_t x) {
  /* code */
}
void main() {
  cents_t cents;
write_dollars_to_database(cents); // compilation succeeds, bank fails
}

However, I see your point, I think it can be gotten around by using a combination of the __LINE__, __FILE__ and __MODULE__ directives!

Charles

On Saturday, 14 March 2015 at 16:01:15 UTC, Namespace wrote:
You can do it this way:
----
struct dollars_t {
    uint _dollar;

    this(uint d) {
        _dollar = d;
    }

    alias _dollar this;
}

struct cents_t {
    uint _cent;

    this(uint c) {
        _cent = c;
    }

    alias _cent this;
}

void do_something_with_dollars(dollars_t d) {
    writeln(d);
}

void main() {
    dollars_t d = 1;

    do_something_with_dollars(d);

    cents_t c = 2;

    //do_something_with_dollars(c);
    //do_something_with_dollars(2);
}
----

Or you can create your own small TypeDef:

----
struct TypeDef(T, size_t l = __LINE__) {
    T _val;

    this(T v) {
        _val = v;
    }

    alias _val this;
}

alias dollars_t = TypeDef!(uint);
alias cents_t = TypeDef!(uint);
----

Thanks to the second template parameter 'l' the template instances of dollars_t and cents_t aren't equal.

Reply via email to