Templates 一个专用的D模板中有多个类型

Templates 一个专用的D模板中有多个类型,templates,d,specialization,Templates,D,Specialization,假设我必须以某种方式处理ushort和uint,但string不同。所以我想我需要一个用于string的专用模板,另一个用于ushort和uint。是吗 // for most void func(T)(T var) { ... } // for uint and ushort void func(T: uint, ushort)(T var) { ... } 这就是想法,尽管代码无法编译。它是有效的还是非常糟糕?试试这个: void func(T)(T var) if ( is(T :

假设我必须以某种方式处理
ushort
uint
,但
string
不同。所以我想我需要一个用于
string
的专用模板,另一个用于
ushort
uint
。是吗


// for most
void func(T)(T var) { ... }

// for uint and ushort
void func(T: uint, ushort)(T var) { ... }

这就是想法,尽管代码无法编译。它是有效的还是非常糟糕?

试试这个:

void func(T)(T var) if ( is(T : uint) || is(T : ushort) )
{
   ...
}

void func(T : string)(T var)
{
   ...
}
您也可以通过一个功能完成此操作:

void func(T)(T var)
{
    static if ( is(T : uint) || is(T : ushort) )
    {
        ...
    }
    else if ( is(T : string) )
    {
        ...
    }
    else
    {
        // handle anything else
    }
}

如果您只需要特定类型,请遵循Peter的答案。
如果您希望涵盖所有整数/数字数据和所有字符串(包括wstring和dstring)数据类型,则可以使用模块中的帮助程序:


你不明白他的意思 混合多模板参数应该这样做

void func(T...)(T args)
{
    static if(T.length==2&&is(T[0]:int)&&is(T[1]:short))
    {
       //do some thing func(int,short)
    }else static if(T.length==1&&is(isSomeString!T[0])
    {
    }otherwise
    {
       static assert("unsupport function");
    }

}

请注意,在第一个示例中,他使用的是模板约束,第二个是编译时条件“static if”。如果模板不处理某些类型,则应使用第一个约束,第二个约束可以与第一个约束一起使用,也可以在处理所有类型时使用。是的,非常有用,这些模板辅助程序也可以用于模板约束。
void func(T...)(T args)
{
    static if(T.length==2&&is(T[0]:int)&&is(T[1]:short))
    {
       //do some thing func(int,short)
    }else static if(T.length==1&&is(isSomeString!T[0])
    {
    }otherwise
    {
       static assert("unsupport function");
    }

}