2016-02-07 1 views
2
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(); 

ответ

1
struct Tuple(Types...){ 
    Types values; 
    alias values this; 
    alias expand = values; 
    static if(Types.length > 0){ 
     this(Types types){ 
      import std.algorithm.mutation; 
      foreach(index, ref t; types){ 
       values[index] = move(t); 
      } 
     } 
    } 
} 

Конструктор была проблема. Вероятно, потому что это приведет к this(), если Types.length == 0, что недопустимо.

+0

Да, вы понимаете правильно. Variadic перечисляет автоматическое расширение при использовании и как таковое, пустой вариационный список полностью эквивалентен «ничего». –

0

Основная проблема заключается в том, что tuple is не a тип: это просто вспомогательная функция, которая возвращает тип, основанный на его аргументах. Поскольку вы не указали никаких аргументов, у него нет действительного типа для возврата и, следовательно, не скомпилируется.

+0

Это неверно. Нет аргумент 'tuple' является законным и возвращает' Tuple!() 'Как тип. –