get from tuple by type
weaselcat via Digitalmars-d-learn
digitalmars-d-learn at puremagic.com
Sun Mar 15 15:35:03 PDT 2015
On Sunday, 15 March 2015 at 22:21:04 UTC, ketmar wrote:
> On Sun, 15 Mar 2015 21:59:16 +0000, Charles Cooper wrote:
>
>> C++14 has:
>> template<class T, class... Types> constexpr T&
>> get(tuple<Types...>& t);
>> Which allows you to get a member of the tuple struct by type.
>> Is there
>> an idiomatic / library way to do this in D? Preferably by
>> indexing.
>
> why indexing? functional programming is fun!
>
> import std.typecons : tuple;
>
> template GetByType(Type, Tuple...) {
> import std.typecons : isTuple;
> static if (Tuple.length == 0)
> static assert(false, Type.stringof~" not found");
> else static if (Tuple.length == 1 &&
> isTuple!(typeof(Tuple[0])))
> enum GetByType = GetByType!(Type, Tuple[0].expand);
> else static if (is(typeof(Tuple[0]) == Type))
> enum GetByType = Tuple[0];
> else
> enum GetByType = GetByType!(Type, Tuple[1..$]);
> }
>
> static assert(2.5 == GetByType!(double, 1, 2.5));
> static assert(2.5 == GetByType!(double, 1, 2.5, 3.1));
> //static assert(2.5 == GetByType!(char, 1, 2.5, 3.1));
> static assert(2.5 == GetByType!(double, std.typecons.tuple(1,
> 2.5)));
> static assert(2.5 == GetByType!(double,
> std.typecons.tuple(1,2.5,3.1)));
Seems like a useful feature(useful enough to get past the C++
standards committee,) consider submitting a phobos PR?
More information about the Digitalmars-d-learn
mailing list