在D中覆盖使用定义的T的!T()?

时间:2011-12-02 02:57:30

标签: type-conversion d

我希望能够使用to!T(string)方法以通用方式轻松地从字符串创建结构和类。但是,我不确定如何“覆盖”该方法以获得此类行为。从我的类型转到字符串很容易(我只想定义opCast(string)),但我正在寻找甚至可能吗?

1 个答案:

答案 0 :(得分:11)

如果您希望自己的类型转换为opCast,请不要为string定义string。这就是toString的用途。 writelnformat等使用toString,而不是投放或toto将使用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");
}