D中的结构参数推导

时间:2012-10-31 03:58:56

标签: templates d type-inference

只是想知道为什么这不编译。我以为编译器可以推断参数化结构的类型?

void main() {
    auto arr = Arr([1,2,3]);
}

struct Arr(T) {
    private T[] data;
}

错误:

junk.d(25): Error: struct junk.Arr(T) is not a function template
junk.d(25): Error: struct junk.Arr(T) cannot deduce template function from argument types !()(int[])

1 个答案:

答案 0 :(得分:8)

表格代码:

auto arr = Arr([1,2,3]);

是在ArrArr时调用struct的构造函数。在这种情况下,没有明确的构造函数。如果存在,它可能已经模板化,参数推断确实适用于模板化构造函数。由于没有构造函数,因此参数将用于按照声明的顺序初始化Arr的字段。但是,当然,Arr是一个模板,所以要构造的类型还不知道。

如果您认为此案例应该有参数推断,请考虑以下事项:

struct Arr(T)
{
    static if(is(T == bool))
        BitArray data;
    else
        T[] data;
}

在上面的例子中,在实例化模板之前,不知道字段的类型(也可能是顺序)......那么它将如何推断?

必须明确实例化模板:

auto arr = Arr!int([1, 2, 3]);