www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - Overloaded opApply for named template mixin

reply "Simen Kjaeraas" <simen.kjaras gmail.com> writes:
Right, I have this:

template foo(T)
{
     int opApply(int delegate(ref T) dg)
     {
         // code here
     }
}

class bar(T)
{
     mixin foo!(T) baz;
}

void main()
{
     bar b = new bar();
     foreach(qux; bar.baz)
     {
     }
}

And it does not compile. The error I get is "expression has no value", on  
the line with the foreach. Do I need to do this in a different way, or is  
it simply not possible (at the moment)?

-- 
Simen
Nov 11 2008
next sibling parent Max Samukha <samukha voliacable.com.removethis> writes:
On Wed, 12 Nov 2008 04:57:41 +0100, "Simen Kjaeraas"
<simen.kjaras gmail.com> wrote:

Right, I have this:

template foo(T)
{
     int opApply(int delegate(ref T) dg)
     {
         // code here
     }
}

class bar(T)
{
     mixin foo!(T) baz;
}

void main()
{
     bar b = new bar();
     foreach(qux; bar.baz)
     {
     }
}

And it does not compile. The error I get is "expression has no value", on  
the line with the foreach. Do I need to do this in a different way, or is  
it simply not possible (at the moment)?
According to the spec, Aggregate in foreach can be array, class, struct or tuple. I don't know why template instances or mixins with opApply were not included. Hopefully, when foreach is updated to work with ranges, everything that looks like a range will be acceptable.
Nov 12 2008
prev sibling parent reply "Christian Hartung" <christian.s77 gmail.com> writes:
Em Wed, 12 Nov 2008 01:57:41 -0200, Simen Kjaeraas  
<simen.kjaras gmail.com> escreveu:

 Right, I have this:

 template foo(T)
 {
      int opApply(int delegate(ref T) dg)
      {
          // code here
      }
 }

 class bar(T)
 {
      mixin foo!(T) baz;
 }

 void main()
 {
      bar b = new bar();
      foreach(qux; bar.baz)
      {
      }
 }

 And it does not compile. The error I get is "expression has no value",  
 on the line with the foreach. Do I need to do this in a different way,  
 or is it simply not possible (at the moment)?
Currently the right way to do this is: template foo(T) { int opApply(int delegate(ref T) dg) { // code } } class bar(T) { mixin foo!(T); } void main() { auto b = new bar!(int); foreach(qux; b) { } } -- Usando o revolucionário cliente de e-mail do Opera: http://www.opera.com/mail/
Nov 12 2008
parent "Simen Kjaeraas" <simen.kjaras gmail.com> writes:
On Wed, 12 Nov 2008 11:37:33 +0100, Christian Hartung  
<christian.s77 gmail.com> wrote:

 Currently the right way to do this is:

 template foo(T)
 {
      int opApply(int delegate(ref T) dg)
      {
          // code
      }
 }

 class bar(T)
 {
      mixin foo!(T);
 }

 void main()
 {
      auto b = new bar!(int);
      foreach(qux; b)
      {
      }
 }
Ah, but that does not give me the named mixin. Consider class Tree(T) { mixin Traverse!(Stack) depthfirst; mixin Traverse!(Queue) breadthfirst; } -- Simen
Nov 12 2008