Recursive templated structs disallowed?

Philippe Sigaud philippe.sigaud at gmail.com
Wed Aug 4 14:26:06 PDT 2010


On Wed, Aug 4, 2010 at 22:06, Steven Schveighoffer <schveiguy at yahoo.com>wrote:

> On Wed, 04 Aug 2010 15:37:32 -0400, Simen kjaeraas <simen.kjaras at gmail.com>
> wrote:
>
>  struct bar( T ) {
>>     auto baz( U )( U arg ) {
>>         bar!( typeof( this ) ) tmp;
>>         return tmp;
>>     }
>> }
>>
>> void main( ) {
>>     bar!int n;
>>     n.baz( 3 );
>> }
>>
>> This code fails with
>> Error: recursive template expansion for template argument bar!(int)
>> Now, I agree it is recursive, but it is not infinitely recursive, so
>> there shouldn't really be a problem.
>> Is this a bug? Is there a workaround?
>>
>
> It's lazily recursive.  Meaning, it *is* infinitely recursive, but the
> compiler does not have to evaluate all the recursions until they are used.
>
> I'm not sure it should be disallowed, but it's definitely on the edge.  Do
> you have some real-world case for this?  If you want to get something like
> this fixed, you'll need a good example, not an academic one.
>
> -Steve
>

I could get this to work, using a factory function:

import std.stdio;

struct Bar( T ) {
   auto baz( U )( U arg ) {
       return bar(this);
   }
}

Bar!T bar(T)(T t)
{
    return Bar!T();
}

void main( ) {
   Bar!int n;
   auto nn = n.baz( 3 );
   writeln(typeof(n).stringof);
   writeln(typeof(nn).stringof);
}

It's... fragile. Changes a few things here and there, and it's back to
infinite recursion.



Philippe
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.puremagic.com/pipermail/digitalmars-d-learn/attachments/20100804/a6da2fcd/attachment.html>


More information about the Digitalmars-d-learn mailing list