As an example I have a cyclic buffer (using std.range.Cycle) where I can set 
the lower and upper bounds of the buffer. I'd also like to enable a stepping 
mode, so I thought first about using std.range.Stride.

The code: http://codepad.org/TR7NDWTC

This line is commented out:
//~ buffer = stride(buffer, newStep);

Obviously I can't assign a Stride structure to a Cycle structure. Structures 
aren't polymorphic.

The idea was that the private _buffer could be traversed in different ways, and 
the Work structure would allow reconfiguration on how the public "buffer" walks 
through the private _buffer array, this would be done at runtime via function 
calls like "setStep" which changes the buffer type.

But this isn't possible since buffer can only be one type, since it's a 
structure.

So the question is, how can I use std.range and its various types  
polymorphically, is that in any way possible?

>From what I can tell std.range functions all return structs. I was hoping of 
>being able to do something like:

class Work
{
    float[256] _buffer;
    InfiniteRange buffer;

    this() { buffer = new InfiniteRange(_buffer); }  // initialize

    void setStride()
    {
        buffer = new Stride(buffer);  // now buffer has a dynamic type of 
Stride, which would be a subtype of InfiniteRange
    }
}

And then main would create a Work object, and call its buffer.front and 
buffer.popFront properties, and later call setStride to change how the object 
behaves by simply creating a new subtype which has the same interface but 
different behavior. 

But I can't do that here since pretty much everything in std.range returns a 
struct.

Reply via email to