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

Ped*_*rda 5 templates d specialization

说我要处理ushortuint一些方法,但string不同的.所以我猜我需要一个专门的模板string和其他两个ushortuint.是吗?


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

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

Run Code Online (Sandbox Code Playgroud)

这是想法,虽然代码无法编译.它有效还是非常糟糕?

Pet*_*der 7

试试这个:

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

void func(T : string)(T var)
{
   ...
}
Run Code Online (Sandbox Code Playgroud)

您也可以在一个函数中执行此操作:

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

  • 请注意,在第一个示例中,他使用模板约束,第二个是编译时条件,'static if'.如果模板没有处理类型,则应使用第一个,第二个可以与第一个一起使用,或者在处理所有内容时使用. (3认同)

van*_*van 6

如果您只需要特定类型,请按照Peter的回答.
如果您想要覆盖所有整数/数字数据和所有字符串(包括wstring和dstring)数据类型,那么您可以使用std.traits模块中的帮助程序:

import std.traits;

void func(T)(T var)
{
    static if (isNumeric!T) { //  or isIntegral!T
        //...
    } else if (isSomeString!T) {
        //...
    }
    else {
        //...
    }
}
Run Code Online (Sandbox Code Playgroud)