Несколько типов в одном специализированном шаблоне D - PullRequest
5 голосов
/ 07 октября 2010

Скажем, я должен иметь дело ushort и uint каким-то образом, но string по-другому.Так что, мне нужен один специализированный шаблон для string, а другой - для ushort и uint.Так ли это?


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

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

Это идея, хотя код не может быть скомпилирован.Это действительно или очень плохо?

Ответы [ 3 ]

7 голосов
/ 07 октября 2010

Попробуйте это:

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
    }
}
6 голосов
/ 07 октября 2010

Если вам нужны только определенные типы, следуйте ответу Петра.
Если вы хотите охватить все целочисленные / числовые данные и все строковые (включая wstring и dstring) типы данных, вы можете использовать помощники из std.traits модуля:

import std.traits;

void func(T)(T var)
{
    static if (isNumeric!T) { //  or isIntegral!T
        //...
    } else if (isSomeString!T) {
        //...
    }
    else {
        //...
    }
}
0 голосов
/ 17 октября 2010

Вы не точно поняли его смысл параметры смешанного шаблона должны выглядеть следующим образом

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

}
...