无法默认初始化自定义类型

时间:2016-02-07 14:35:23

标签: d

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();

2 个答案:

答案 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 不是类型:它只是一个辅助函数,它根据参数返回一个类型。由于您没有提供任何参数,因此它没有返回的有效类型,因此无法编译。