Tuple indexing and slicing

Timothee Cour thelastmammoth at gmail.com
Wed Jul 10 20:00:23 PDT 2013


On Wed, Jul 10, 2013 at 6:16 PM, Jonathan M Davis <jmdavisProg at gmx.com>wrote:

> On Wednesday, July 10, 2013 18:10:42 Timothee Cour wrote:
> > On Wed, Jul 10, 2013 at 5:49 PM, Artur Skawina <art.08.09 at gmail.com>
> wrote:
> > > On 07/11/13 00:52, Timothee Cour wrote:
> > > > Why not support Tuple indexing and slicing with [] syntax?
> > > >
> > > > (see below for a way to index/slice a tuple)
> > >
> > > Not sure I understand the question.
> > > I guess you'd like this to work for some library pseudo-tuple type
> > > - I've not looked at those, somebody else may give you a better answer.
> > >
> > > "Native" tuples already support what you're asking for:
> > > template Tuple(A...) { alias Tuple = A; }
> > >
> > > void main(){
> > >
> > > alias T=Tuple!(int,double);
> > > pragma(msg,T[0].stringof);
> > > pragma(msg,T[0..2].stringof);
> > > pragma(msg,typeof(T.init[0]).stringof);
> > > pragma(msg,typeof(Tuple!(T.init[0..$])).stringof);
> > >
> > > }
> > >
> > > artur
> >
> > I know native tuples do, I am aksing about std.typecons.Tuple.
> > Is there any way to support this in library code ?
> > If not, how about changing compiler to allow this?
> >
> > I'd like that:
> > static assert(is(Tuple!(int,double)[0]==int));
> > static assert(is(Tuple!(int,double)[0..$]==Tuple!(int,double)));
>
> Do you want to slice the _type_ or the object? Adding slicing of the value
> should be trivial enough if Tuple doesn't support it already. But slicing
> the
> type would require that the compiler understand Tuple or that some means of
> overloading opSlice on the types themselves (rather the objects of those
> types) be provided. And I wouldn't expect either of those to happen.
>
> - Jonathan M Davis
>


ok I found a great solution that allows lightweight slicing/indexing of
std.typecons.Tuple:
using the Expand template below.

Can we add this to std.typetuple? or std.typecons?

import std.typecons;

template Expand(T)if(isTuple!T){
  alias Expand=typeof(T.init.expand);
}

unittest{
  import std.typetuple;
  alias T=Tuple!(int,double);
  static assert(is(Expand!T == TypeTuple!(int,double)));

  //now we can easily slice/index T:
  static assert(is(Expand!T[0..1] == TypeTuple!(int)));
  static assert(is(Expand!T[0] == int));
}
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.puremagic.com/pipermail/digitalmars-d-learn/attachments/20130710/f2c21872/attachment-0001.html>


More information about the Digitalmars-d-learn mailing list