Can we get rid of opApply?

Denis Koroskin 2korden at gmail.com
Tue Jan 20 15:01:45 PST 2009


On Wed, 21 Jan 2009 01:38:50 +0300, Steven Schveighoffer <schveiguy at yahoo.com> wrote:

> "Daniel Keep" wrote
>>
>>
>> Steven Schveighoffer wrote:
>>> "Robert Fraser" wrote
>>>> Steven Schveighoffer wrote:
>>>>> The other possibly sensible reason to keep opApply is for
>>>>> interfaces/classes.  Ranges as a class would be slower than even
>>>>> opApply,
>>>>> as each loop iteration would call a virtual function.
>>>> There would only need to be one vtable lookup for each function (since
>>>> every iteration would use the same head(), next(), etc.) So it would  
>>>> be
>>>> the same price as opApply (a function pointer call). Well, 3 times the
>>>> price, since 3 functions need to be called.
>>>
>>> You could technically cache the vtable lookup, but a vtable call costs
>>> more
>>> than a delegate call (one lookup for vtable, then function + pointer  
>>> call
>>> vs. just function + pointer call).  But besides that, yes, it would be  
>>> 3
>>> functions called per iteration.  So still slower...
>>>
>>> -Steve
>>
>> Add opRange and allow it to return a struct.
>
> How do you define that in an interface?  You must pre-define the struct,
> which means the struct must have implementation details before the class  
> is
> even written.
>
> -Steve
>
>

Interface implies virtual methods. As such, you can use the following:

interface IRange(T)
{
    T head();
    bool empty();
    void next();

    IRange!(T) opRange();
}





More information about the Digitalmars-d mailing list