使用表达式或类型名称调用D模板(DLang)

时间:2016-08-23 05:40:37

标签: templates d

我正在尝试调用D模板并在传递的参数上调用.sizeof,理想情况下可以是typename(或类型表达式),或变量名称或表达式(当然也有类型)。

我目前不得不复制模板,如此

template mytem( alias T ) { xxx T.sizeof xxx }

template mytem( T ) { xxx T.sizeof xxx }

我该如何正确地做事?

1 个答案:

答案 0 :(得分:4)

好吧,根据你所拥有的,第一个模板几乎可以在不需要第二个模板的情况下工作。例如,这段代码

struct S
{
    int i;
}

template size(alias T)
{
    enum size = T.sizeof;
}

void main()
{
    pragma(msg, size!10);
    pragma(msg, size!S);
    pragma(msg, size!(S(10)));
}

打印

4LU
4LU
4LU

但是,它不适用于内置类型 - 例如size!int无法编译。问题是alias参数应该接受符号,而内置类型如int是关键字而不是符号。我的理解是,在经过一番讨论之后,Walter Bright确信它应该被更改,以便alias参数更像alias语句,并且他们会接受内置类型,但是这种变化并没有'已经制作好了。同时解决方法是使用可变参数模板,但将其限制为长度为1.例如

struct S
{
    int i;
}

template size(T...)
    if(T.length == 1)
{
    enum size = T[0].sizeof;
}

void main()
{
    pragma(msg, size!10);
    pragma(msg, size!S);
    pragma(msg, size!(S(10)));
    pragma(msg, size!int);
}

打印

4LU
4LU
4LU
4LU