我试图调用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