2011-12-02 14 views
9

Ho strutture e classi che mi piacerebbe poter creare facilmente da stringhe in modo generico, usando il metodo to!T(string). Tuttavia, non sono sicuro di come "sovrascrivere" il metodo per ottenere questo tipo di comportamento. Andare dal mio tipo alla stringa è facile (vorrei solo definire opCast(string)), ma è quello che sto cercando anche possibile?Ignora su! T() per T-D definito utilizzato in D?

risposta

11

Non definire un opCast per string se si desidera convertire il tipo in string. Questo è ciò che è toString. writeln e format e l'uso come toString, senza fusione o to, e to utilizzerà toString, quindi è sicuramente meglio per definire toString per la conversione a string. Si definisce opCast per la conversione in tipi altro rispetto a string. Quindi puoi usarlo con il casting o con to.

Ora, se si desidera convertire un string nel tipo definito dall'utente, è sufficiente definire il costruttore appropriato e questo funzionerà con to.

import std.conv; 

struct S 
{ 
    int i; 

    this(string s) 
    { 
     i = to!int(s); 
    } 

    string toString() 
    { 
     return to!string(i); 
    } 
} 

void main() 
{ 
    auto s = to!S("42"); 
    assert(s.i == 42); 
    auto t = to!string(s); 
    assert(t == "42"); 
} 
+0

Fantastico, non sapevo che era così semplice! –