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);
}
}
我为什么要写
auto t = Tuple!Foo();
// but not
auto t1 = tuple();
错误是
构造函数meta.Tuple!()。Tuple.this结构的默认构造函数只允许使用@disable,没有正文,没有参数
但如果我@disable this()
,它就不会消失。此外std.typecons.Tuple
也没有这样做,似乎工作正常。
auto t3 = std.typecons.tuple();
答案 0 :(得分:1)
if x != 'q': # if the input is anything other than 'q'
try:
lista.append(int(x)) # convert to an 'int' & append
except ValueError:
continue # invalid input, start over
print("Numbers on list:")
print(lista)
else: # break if x == 'q'
break
构造函数是问题所在。可能是因为如果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
,这是不允许的。
答案 1 :(得分:0)
基本问题是tuple
不是类型:它只是一个辅助函数,它根据参数返回一个类型。由于您没有提供任何参数,因此它没有返回的有效类型,因此无法编译。