2010-10-07 12 views
5

Dire che devo trattare ushort e uint in qualche modo, ma string in modo diverso. Quindi suppongo di aver bisogno di un modello specializzato per string e altro per entrambi ushort e uint. È?Tipi multipli in un modello D specializzato


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

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

Questa è l'idea, anche se il codice non può compilare. È valido o molto cattivo?

risposta

7

Prova questo:

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

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

Si potrebbe anche farlo in una sola funzione:

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

Si noti che nel primo esempio utilizza Vincoli di modello e il secondo è un condizionale in fase di compilazione, "statico se". Il primo dovrebbe essere usato se ci sono tipi che il modello non gestisce, il secondo può essere usato con il primo o quando tutto viene gestito. –

6

Se avete bisogno solo determinati tipi, seguire la risposta di Pietro.
Se si desidera coprire tutti i dati integrali/numerici e tutte le stringhe (tra cui wstring e dstring) i tipi di dati, allora si potrebbe utilizzare aiutanti dal modulo std.traits:

import std.traits; 

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

Trucchetto utile, +1! Tuttavia, il problema era costituito da tipi specifici. –

+0

Sì, molto utile e questi helper per i modelli possono essere utilizzati anche in Vincoli di modelli. –

0

Tu non sei preciso capire il suo mix significato i parametri multi-template dovrebbero fare così

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

} 
Problemi correlati