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

时间:2010-10-07 05:04:17

标签: templates d specialization

说我必须以某种方式处理ushortuint,但string会有所不同。因此,我需要stringushort以及uint的其他专用模板。是吗?


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

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

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

3 个答案:

答案 0 :(得分:7)

试试这个:

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
    }
}

答案 1 :(得分: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 {
        //...
    }
}

答案 2 :(得分:0)

你并不准确理解他的意思 混合多模板参数应该像这样做

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");
    }

}