Firstly, let me preface this... if you use templates to get
around the const system's imperfections, you are admitting that
the const system is broken. Now, on with the program.
My unique experience in using D2 without Phobos lead me to
encounter two cases that show how the D2 const system is just a
pain in the behind for some really reasonable tasks.
First case:
You want to sort an array of strings using a function. Strings
can be all of these types: char[], const(char)[] and
immutable(char)[]. What would be the signature of such a function?
It can't be sort(const(char)[][]) because it's unsafe to case
char[][] and immutable(char)[][] to that argument type (see
http://d.puremagic.com/issues/show_bug.cgi?id=4251 ).
It can't be sort(const(char[])[]) because you can't actually sort
that!
The only good way I found is to use a cast inside the function
with the second signature. Obviously I'm glad there's a
workabout, but surely a cast isn't a good thing.
Second case:
inout was meant to solve issues with functions that return slices
of inputs. What about a class that is dedicated to the same
functionality?
E.g. this works fine:
inout(char)[] half(inout(char)[]);
But what about this:
struct Slicer
{
char[] a;
char[] half();
}
Note that the type of the input (the member 'a') must be the same
as the output of the half method. I don't know how to accomplish
this without templates. But as I said in the preface, you
shouldn't need templates for such a simple task. Note that doing
this isn't satisfactory:
struct Slicer
{
char[] a;
inout(char)[] half() inout;
}
because there may be other members inside that struct that may
need to remain mutable.
This is very relevant, incidentally, for the planned library
implementation of associative arrays. How would this be
implemented when an associative array is a struct?
inout(char)[] test(inout(char)[])
{
inout(char)[][int] a;
}
It doesn't even compile now (in dmd 2.058).
I don't have any solutions to these problems, incidentally... I
think they are complex, but definitely worthy of having a
reasonable solution that doesn't involve needless (in this case)
templates.
-SiegeLord