Bug 12530 – uniform initialization for type tuples too

Status
NEW
Severity
enhancement
Priority
P4
Component
dmd
Product
D
Version
D2
Platform
All
OS
All
Creation time
2014-04-06T12:14:28Z
Last change time
2024-12-13T18:19:29Z
Assigned to
No Owner
Creator
monarchdodra
Moved to GitHub: dmd#18811 →

Comments

Comment #0 by monarchdodra — 2014-04-06T12:14:28Z
Not sure if enhancement request or bug, but filing as EH. I think these should work: //---- auto a = TypeTuple!(int, int, int)(); //(0, 0, 0) auto b = TypeTuple!(int, int, int)(1); //(1, 1, 1) //auto c = TypeTuple!(int, int, int)(1, 2); //Should fail auto d = TypeTuple!(int, int, int)(1, 2, 3); //(1, 2, 3) //---- Currently they all produce: Error: function expected before (), not (int, int, int) of type (int, int, int) In particular, I think this should work: //---- TypeTuple!(int, int, int) a = ...; TypeTuple!(int, int, int) b = TypeTuple!(int, int, int)(a); //---- Though arguably, it's the exactly the same as the "d" case above.
Comment #1 by bearophile_hugs — 2014-04-06T12:32:55Z
(In reply to comment #0) > I think these should work: > > auto a = TypeTuple!(int, int, int)(); //(0, 0, 0) > auto b = TypeTuple!(int, int, int)(1); //(1, 1, 1) > //auto c = TypeTuple!(int, int, int)(1, 2); //Should fail > auto d = TypeTuple!(int, int, int)(1, 2, 3); //(1, 2, 3) Please show one or more use cases.
Comment #2 by monarchdodra — 2014-04-06T13:02:13Z
(In reply to comment #1) > Please show one or more use cases. I've had need of this, for example, to transform the types of variadic arguments, before passing them to another function. "reduce" or "uninitializedArray" come to mind: //---- void main() { uninitialized!(int[][])(1, 2); } alias ToSizeT(T) = size_t; enum IsSizeT(T) = is(S == size_t); auto uninitialized(T, Args...)(Args args) { //transform the "int" inference to "size_t" alias SizeTArgs = staticMap!(ToSizeT, Args); //Call with the same arguments, but cast to size_t... //if the cast is implicitly safe return impl!T(SizeTArgs(args)); } auto impl(T, Args...)(Args args) //Avoid bloat by requesting size_t args. { static assert(allSatisfy!(IsSizeT, Args)); } //---- The same design can be used to transform/forward args, say to unqualify all of them at once: //---- void myFun(Args(Args args)) { alias UArgs = staticMap!(Unqual, Args); static if (!is(UArgs == ARgs)) myFun(UArgs(args)); else { //actual implementation here } } Or, in the case of reduce, to build the different seeds from front: auto result = tuple(SeedTypes(r.front));
Comment #3 by nick — 2024-08-23T16:47:24Z
> auto b = TypeTuple!(int, int, int)(1); //(1, 1, 1) ... > TypeTuple!(int, int, int) a = ...; > TypeTuple!(int, int, int) b = TypeTuple!(int, int, int)(a); Not uniform initialization, but you can do: import std.meta: AliasSeq; AliasSeq!(int, int, int) vs = 1; assert(vs == AliasSeq!(1, 1, 1)); AliasSeq!(int, int, int) xs = vs;
Comment #4 by robert.schadek — 2024-12-13T18:19:29Z
THIS ISSUE HAS BEEN MOVED TO GITHUB https://github.com/dlang/dmd/issues/18811 DO NOT COMMENT HERE ANYMORE, NOBODY WILL SEE IT, THIS ISSUE HAS BEEN MOVED TO GITHUB