用表达式或typename (DLang)调用的D模板



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

我现在必须复制模板,像这样

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

我如何正确地做事?

好吧,从你那里,第一个模板几乎工作不需要第二个。例如,以下代码

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

相关内容

  • 没有找到相关文章

最新更新