On 06/15/2014 08:32 PM, Dicebot wrote:
http://wiki.dlang.org/DIP63
This is solution for a problem I am currently having with implementing
http://wiki.dlang.org/DIP54 (afair it was also mentioned by Timon Gehr
during old discussion of that DIP)
New proposed semantics ( to catch your attention and get to read the
link ;) ):
template Pack(T...)
{
alias expand = T;
alias opIndex(size_t index) = T[index];
alias opSlice(size_t lower, size_t upper) = Pack!(T[lower..upper]);
alias opDollar = T.length;
}
// no ambiguity as Pack!(int, int) is not a valid type
// is(element == int)
alias element = Pack!(int, int)[1];
LGTM. Maybe you can add something along the following lines as another
motivating use case:
struct Tuple(T...){
T expand;
template Pack(){
auto opSlice(size_t lower, size_t upper){
return tuple(expand[lower..upper]);
}
}
alias Pack!() this;
}
auto tuple(T...)(T args){ return Tuple!T(args); }
void main(){
Tuple!(double,int,string) t1=tuple(1.0,2,"three");
auto t2=t1[1..$];
static assert(is(typeof(t2)==Tuple!(int,string)));
foreach(i,v;t1) writeln(i,": ",v);
}
I.e. this solution is general enough to fix the "unhygienic" behaviour
of Phobos tuple slicing.