toString refactor in druntime
Jonathan Marler via Digitalmars-d
digitalmars-d at puremagic.com
Mon Nov 3 20:34:08 PST 2014
On Tuesday, 4 November 2014 at 02:49:55 UTC, Steven Schveighoffer
wrote:
> On 11/3/14 6:05 PM, Jonathan Marler wrote:
>> In many cases templates are good because they provide the a
>> way for the
>> programmer to use a library optimized for their particular
>> application.
>> This is the case for the toString function. An argument can
>> be made
>> that using templates is dangerous because if they are used
>> incorrectly,
>> the number of template instantiates can blow up. But this can
>> always be
>> solved by the programmer by changing all their template calls
>> to use the
>> same template parameters. This allows the template solution to
>> simultaneously support a sink that represents a real function,
>> or a
>> delegate, or whatever the application needs.
>
> If we make toString a template, we precludes it as a virtual
> function, and we force the object to expose its inner workings.
>
> I think the template solution has advantages, one being the
> possibility for optimization. But I don't think the gains are
> significant enough. It's also more complex than necessary.
>
I was thinking you could have the best of both worlds with
templates. For example, you could define the toString template
like this:
void toStringTemplate(T)(T sink)
if(isOutputRange!(T,const(char)[]))
Then you could declare an alias like this:
alias toString = toStringTemplate!(void
delegate(const(char)[]));
Which (correct me if I'm wrong) I believe is equivalent to the
original sink delegate function. This allows programmers to
write the logic for toString once and allow a developer using the
library to choose whether they want to use the delegate version
or the generic output range version.
This gives the user of the library the ability to choose the best
version for their own application.
Note: I added this "alias" method to my dtostring.d test code and
it wasn't as fast as the delegate version. I'm not sure why as I
thought the generated code would be identical. If anyone has any
insight as to why this happened let me know.
code is at http://marler.info/dtostring.d
More information about the Digitalmars-d
mailing list