On Tue, Aug 18, 2020 at 05:34:58AM +0000, novice3 via Digitalmars-d-learn wrote:
[...]
> The problem is:
> if i use fmt.spec in overloaded toString(),
> when i get error "phobos/std/format.d(2243): Error: no property ip for
> type onlineapp.IpV4Address"

Here's a working example:

---------------------------------------------
import std;

struct IpV4Address
{
        private uint ip;
        alias ip this;

        void toString(W,Char)(W sink, FormatSpec!Char fmt)
        {
                if (fmt.spec == 's') {
                        // Deal with %s here
                        sink.formattedWrite("%d.%d.%d.%d",
                                (ip >> 24) & 0xFF, (ip >> 16) & 0xFF,
                                (ip >> 8) & 0xFF, ip & 0xFF);
                } else {
                        // Everything else
                        formatValue(sink, this.ip, fmt);
                }
        }

        // This unittest is to workaround the sillyness that if toString
        // doesn't compile, std.format pretends it doesn't exist and/or
        // the compiler swallows the real error and substitutes it with
        // an irrelevant error that has nothing to do with the real
        // problem.
        unittest
        {
                IpV4Address ip;
                auto app = appender!string;
                ip.toString(app, FormatSpec!char.init);
        }
}

unittest
{
        auto ip = IpV4Address(0x01020304);
        writefln("%s", ip);
        writefln("%x", ip);
        writefln("%d", ip);
}
---------------------------------------------


T

-- 
No! I'm not in denial!

Reply via email to