writeln an object

Ali Çehreli acehreli at yahoo.com
Fri Apr 19 13:51:24 PDT 2013


On 04/19/2013 01:35 PM, gedaiu wrote:

 > Ok, i understand now the diference...
 >
 > my question is how I should solve this problem?

The keyword 'override' cannot be used with structs. You have at least 
two good options with structs:

1) Define a const toString() member function that returns the string 
representation of the object, conveniently produced by std.string.format:

import std.stdio;
import std.string;

struct TimeOfDay
{
     int hour;
     int minute;

     string toString() const
     {
         return format("%02s:%02s", hour, minute);
     }
}

void main()
{
     auto t = TimeOfDay(10, 20);
     writeln(t);
}

2) As the previous method is unnecessarily inefficient especially when 
the members are structs as well, define the toString() overload that 
takes a sink delegate. std.format.formattedWrite is smart enough to take 
advantage of it and avoids multiple string instances. Everything gets 
appended to the same output string:

import std.stdio;
import std.format;

struct TimeOfDay
{
     int hour;
     int minute;

     void toString(scope void delegate(const(char)[]) output) const
     {
         formattedWrite(output, "%02s:%02s", hour, minute);
     }
}

struct Duration
{
     TimeOfDay begin;
     TimeOfDay end;

     void toString(scope void delegate(const(char)[]) output) const
     {
         formattedWrite(output, "from %s to %s", begin, end);
     }
}

void main()
{
     auto d = Duration(TimeOfDay(10, 20), TimeOfDay(11, 22));
     writeln(d);
}

Ali



More information about the Digitalmars-d-learn mailing list