On Wednesday, 12 June 2013 at 06:08:58 UTC, deadalnix wrote:
...
I like it!
The idea popped in my mind yesterday, so it is not really super
fleshed out, and I'm not sure if some horrible dark corner case
makes it completely worthless. But it seems super promising to
me, so I want to share. The current situation isn't satisfying
and we desperately need a solution.
Maybe...
Within the template, T is always seen as inout, and only one
instantiation occur for all top type qualifiers. Array!T and
Array!const(T) refers to the same instance of Array. As a
result, this makes it impossible to specialize Array on T's
type qualifier.
OK, but how do you handle methods that rely on T being
(potentially) mutable? For example:
//----
struct Foo(inout T)
{
T a;
static if (isAssignable!T) //So here, "T" is actually "inout
T", correct?
{
void opAssign(T other)
{a = other.a;}
}
}
//----
Or is the idea that when instantiated with a "const T", non const
methods are not compiled in for that instantiation...?
What about:
//----
struct Foo(inout T)
{
T[10] buffer;
size_t i = 0;
ref T get() const {return buffer[i];}
void setIndex(size_t i){this.i = i;}
}
//----
This time, the mutable method works, even when T is not mutable :/
I haven't thought through the implications, but it looks like
there is a little something missing to make it work.
I DO like your proposition a lot. Being able to have templates
that are all instanciated based on the Unqualed type is definitly
a plus.