2010-10-07 21 views
5

Digamos que tengo que tratar ushort y uint de alguna manera, pero string de manera diferente. Supongo que necesito una plantilla especializada para string y otra para ushort y uint. ¿Lo es?Múltiples tipos en una plantilla D especializada


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

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

Esa es la idea, aunque el código no se puede compilar. Es válido o muy malo?

Respuesta

7

Prueba esto:

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

void func(T : string)(T var) 
{ 
    ... 
} 

También puede hacerlo en una función:

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

Tenga en cuenta que en el primer ejemplo usa restricciones de plantilla, y el segundo es un tiempo de compilación condicional, 'static if'. El primero se debe usar si hay tipos que la plantilla no maneja, el segundo se puede usar con el primero o cuando se maneja todo. –

6

Si necesita sólo tipos específicos, siga la respuesta de Pedro.
Si desea para cubrir todos los datos integrales/numéricos y toda la cadena (incluyendo wstring y dstring) tipos de datos, entonces se podría utilizar ayudantes de std.traits módulo:

import std.traits; 

void func(T)(T var) 
{ 
    static if (isNumeric!T) { // or isIntegral!T 
     //... 
    } else if (isSomeString!T) { 
     //... 
    } 
    else { 
     //... 
    } 
} 
+0

Truco útil, +1! Sin embargo, los tipos específicos fueron el problema. –

+0

Sí, muy útil, y estos ayudantes de plantillas también se pueden usar en Restricciones de plantillas. –

0

Usted no es preciso entender su mezcla significado los parámetros de multi plantilla deberían hacer esto

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

} 
Cuestiones relacionadas