2011-12-02 11 views
9

Tengo estructuras y clases que me gustaría poder crear fácilmente a partir de cadenas de forma genérica, utilizando el método to!T(string). Sin embargo, no estoy seguro de cómo podría 'anular' el método para obtener este tipo de comportamiento. Pasar de mi tipo a la cadena es fácil (solo definiría opCast(string)), pero ¿es lo que estoy buscando posible?Anular a! T() para T definida en uso en D?

Respuesta

11

No defina opCast para string si desea que su tipo se convierta a string. Eso es lo que toString es para. writeln y format y el uso como toString, no colada o to, y to utilizará toString, por lo que es definitivamente mejor para definir toString para convertir a a string. Defina opCast para convertir a los tipos otros que string. Entonces puede usar eso con casting o con to.

Ahora, si quiere convertir un string a su tipo definido por el usuario, simplemente defina el constructor apropiado, y eso funcionará 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

¡Fantástico, no me di cuenta que era así de simple! –

Cuestiones relacionadas