Nothing new here... I'm just reminded of how templates can help with DRY (don't repeat yourself) code.

Here is a piece of code that uses an alias to be flexible on the element type:

import std.conv;

alias MyType = double;    // <-- Nice, MyType is used twice below

void main() {
    MyType[] a;

    // ...

    string s = "1.2";
    a ~= s.to!MyType;     // <-- This usage is troubling
}

Although to!MyType looks like a good idea there, the two usages of MyType must be kept in sync manually. Why should we repeat MyType when it's already known to be ElementType!(typeof(a)) anyway. (Unfortunately, that syntax is not very clear in code.)

One solution is to wrap ~= in a function template. Now the conversion is automatically made to the element type of the array:

import std.conv;

void append(T, S)(ref T[] arr, S s) {
    arr ~= s.to!T;
}

void main() {
    double[] a;    // <-- Removed MyType alias as well

    // ...

    string s = "1.2";
    a.append(s);
}

In simple cases like this, one may not even need the alias. 'double' appears in just one place there.

I think append() could be a part of std.array but I can't find anything like that in Phobos.

Ali

Reply via email to