2010-10-07 8 views
5

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


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

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

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

ответ

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

Обратите внимание, что в первом примере он использует Template Constraints, а второй - это условное время компиляции, 'static if.' Первый должен использоваться, если существуют типы, которые шаблон не обрабатывает, второй может использоваться с первым или когда все обрабатывается. –

6

Если вам нужны только определенные типы, следовать ответ Питера.
Если вы хотите, чтобы охватить все интегральные/числовые данные и все строки (в том числе 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

Полезный трюк, +1! Однако специфические типы были проблемой. –

+0

Да, очень полезно, и эти помощники шаблонов также могут использоваться в Template Constraints. –

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

}