TDPL: Overloading template functions

Andrej Mitrovic andrej.mitrovich at gmail.com
Fri Jul 30 05:35:11 PDT 2010


Thanks Phillippe, that explains a lot.

I like to try out all the examples, I never take any of it for granted. But
hardly any book comes with 100% working examples, even the much praised CPL
is loaded with syntax mistakes. With that said I have to admit I'm really
enjoying reading TDPL so far.

On Fri, Jul 30, 2010 at 12:11 PM, Philippe Sigaud <philippe.sigaud at gmail.com
> wrote:

> On Thu, Jul 29, 2010 at 23:28, Andrej Mitrovic <andrej.mitrovich at gmail.com
> > wrote:
>
>> How do I print out an expanded tuple but with spaces between the values?
>> There's this example on page 164:
>>
>> import std.typecons, std.stdio;
>>
>> void fun(T...)(T args) {
>>     // create a tuple to pack all arguments together
>>     gun(tuple(args));
>> }
>>
>> void gun(T)(T value) {
>>     // expand the tuple back
>>     writeln(value.expand);
>> }
>>
>> void main() {
>>     fun(1);
>>     fun(1, 2.2);
>> }
>>
>> This prints out:
>> 1
>> 12.2
>>
>> But that's confusing, since the values are "glued" together when printed
>> out. I really want to print out:
>> 1
>> 1 2.2
>>
>> Any ideas?
>>
>
> You can iterate on the values and create the corresponding string. Note
> that you must have a polymorphic function to map on a tuple's elements.
>
> void gun(T)(T value)
> {
>     string result;
>     foreach(index, Type; value.expand)
>     {
>         result ~= to!string(value.expand[i]) ~ "  ";
>     }
>     writeln(result);
> }
>
> There will be a surnumerary " " at the very end, but I prefer to show the
> way to iterate on a tuple. value is a std.typecons.Tuple, but value.expand
> gives access to the raw (T...) tuple inside it.
>
>
>
>>
>> One other thing. I can use the .length property for value and parameter
>> tuples, but only if I haven't built them myself with the call to
>> std.typecons.tuple(). For example I can call writeln(T.length) in the fun()
>> function (where the compiler automatically constructs a tuple), but not in
>> the gun() function. So there seems to be compiler tuples and
>> user-constructed tuples, which are not the same.
>>
>
> Yes, std.typecons.Tuple should have a length, it's trivial to add. It's
> issue #4381
>
> http://d.puremagic.com/issues/show_bug.cgi?id=4381
>
> And yes, there are 'raw', compiler-managed tuples which are lists of types
> and values 'glued' together. They are powerful, iterable, indexable,
> slicable, know their length, etc. They may even be assignable. Ah, in fact,
> they can hold anything that can be passed as a template argument, I guess.
> But, being a bunch of many different types, they cannot be returned by a
> function. That's C inheritance for you. They have no .init value neither,
> which I found too bad for generic code.
>
> http://d.puremagic.com/issues/show_bug.cgi?id=4536
>
> So std.typecons.Tuple provides a way to wrap values inside a struct, while
> giving access to the types and values, and that can be returned by a
> function. It can also have named members, which can be quite handy when you
> return many things from a function, grouped inside a tuple.
>
> Tuple!("index", int, "sum", double) t = tuple(1,3.14);
>
> assert(t.index== 1); // t has .first and .second as members.
> assert(t.sum== 3.14);
>
>
>
>>
>> It's a bit of a shame that there isn't a chapter on tuples except this
>> brief mention (I don't see it listed in the contents page). I guess I'll
>> take a look at the implementation.
>>
>>
> Andrei didn't want to talk too much about Phobos, as it was (ans still is!)
> in flux while he was writing this. D the language will not change much for
> some time, while the standard library is being actively transformed, if only
> to take into account the new features that were added for the past 6 months.
>
> btw, I like you posts, but do not always have the time to answer them. If
> among the numerous issues you posted there there is still one that bother
> you, do not hesitate to ask again for an answer.
>
>  Philippe
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.puremagic.com/pipermail/digitalmars-d/attachments/20100730/3e050756/attachment.html>


More information about the Digitalmars-d mailing list