struct Tuple(Types...){
Types values;
this(Types types){
import std.algorithm.mutation;
foreach(index, ref t; types){
values[index] = move(t);
}
}
alias values this;
}
auto tuple(Ts...)(Ts ts){
import std.algorithm.mutation;
static if(Ts.length == 0){
return Tuple!Ts(ts); // This is the problem
}
else{
return unpack!(move).into!(Tuple!Ts)(ts);
}
}
static template unpack(alias f){
pragma(inline)
auto into(alias target, Args...)(auto ref Args args){
import std.conv;
import std.algorithm;
import std.range;
enum s = `target(`~iota(Args.length).map!(i=>text(`f(args[`,i,`])`)).join(",")~`)`;
return mixin(s);
}
}
Почему я могу написатьНевозможно по умолчанию INIT пользовательского типа
auto t = Tuple!Foo();
// but not
auto t1 = tuple();
Ошибка
конструктор meta.Tuple!(). Tuple.this конструктор по умолчанию для структур разрешено только с @disable, без кузова и без параметров
, но он не исчезает, если я @disable this()
. Также std.typecons.Tuple
также не делает этого и кажется, что все работает отлично.
auto t3 = std.typecons.tuple();
Да, вы понимаете правильно. Variadic перечисляет автоматическое расширение при использовании и как таковое, пустой вариационный список полностью эквивалентен «ничего». –