【问题标题】:Override to!T() for used-defined T in D?为 D 中使用定义的 T 覆盖 to!T()?
【发布时间】:2011-12-02 02:57:29
【问题描述】:

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

【问题讨论】:

    标签: type-conversion d


    【解决方案1】:

    如果您希望您的类型转换为string,请不要为string 定义opCast。这就是toString 的用途。 writelnformat 等使用toString,不强制转换或to,而to 将使用toString,所以定义toString 转换为string 肯定更好。您定义 opCast 以转换为类型 other 而不是 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");
    }
    

    【讨论】:

    • 太棒了,没想到这么简单!
    猜你喜欢
    • 2018-07-04
    • 1970-01-01
    • 2016-03-16
    • 1970-01-01
    • 2012-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-21
    相关资源
    最近更新 更多