Переопределить в! T () для используемого T в D? - PullRequest
9 голосов
/ 02 декабря 2011

У меня есть структуры и классы, которые я хотел бы легко создавать из строк общим способом, используя метод to!T(string).Однако я не уверен, как я мог «переопределить» метод для получения такого поведения.Переход от моего типа к строке легко (я бы просто определил opCast(string)), но возможно ли то, что я ищу?

1 Ответ

11 голосов
/ 02 декабря 2011

Не определяйте opCast для string, если вы хотите, чтобы ваш тип конвертировался в string. Вот для чего toString. writeln и format и т. П. Используют toString, а не приведение или to, а to будет использовать toString, поэтому определенно лучше определить toString для преобразования в string. Вы определяете opCast для преобразования в типы , отличающиеся , чем string. Тогда вы можете использовать это с кастингом или с to.

Теперь, если вы хотите преобразовать string в ваш пользовательский тип, просто определите соответствующий конструктор, и он будет работать с 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");
}
...