Changeing return type of struct.toString()
Steven Schveighoffer
schveiguy at yahoo.com
Mon Feb 13 06:23:01 PST 2012
On Mon, 13 Feb 2012 08:40:20 -0500, Benjamin Thaut
<code at benjamin-thaut.de> wrote:
> Am 13.02.2012 13:26, schrieb Stewart Gordon:
>> On 13/02/2012 02:21, Don wrote:
>> <snip>
>>> I don't know why struct toString() still exists.
>> <snip>
>>
>> What are you talking about? If you define a struct, it doesn't have any
>> methods other than the ones you put into it.
>>
>> Stewart.
>
> import std.stdio;
>
> struct fun
> {
> string toString()
> {
> return "fun";
> }
> }
>
> void main(string[] args)
> {
> auto ti = cast(TypeInfo_Struct)typeid(fun);
> fun gun;
> writefln("%d",cast(void*)ti.xtoString);
> writefln("%s",ti.xtoString(&gun));
> }
>
> If you change the return type of toString() to int for example the
> program will crash because ti.xtoString will be null. Therefore the
> compiler seems to check what type toString() does return and only fills
> the type info if it actually does return a string.
That is a legacy feature, back when writefln was a D variadic function
(not a template), and all you had was the TypeInfo.
It's essentially a hack that the compiler puts several "special" function
pointers into the typeinfo to give structs a sort of runtime interface. I
think we can get rid of most, if not all, of those x-functions. But then
we need to get rid of all the usages of those. It shouldn't be too
difficult at this point, it just needs to be done.
-Steve
More information about the Digitalmars-d
mailing list