Should opIndex completely override alias this?

Artur Skawina art.08.09 at gmail.com
Fri May 11 11:31:59 PDT 2012


On 05/11/12 19:47, Mehrdad wrote:
> On Friday, 11 May 2012 at 17:37:11 UTC, Artur Skawina wrote:
>> On 05/11/12 19:22, Mehrdad wrote:
>>> On Friday, 11 May 2012 at 17:19:28 UTC, kenji hara wrote:
>>>> This is expected behavior.
>>>>
>>>> 'alias this' works as proper super type.
>>>>
>>>> struct S { T[] data; alias data this; }
>>>>
>>>> In this code, S behaves as it is derived from T[] .
>>>>
>>>> Following to this view, the definition of opIndex in S overrides (and
>>>> hides) T[]'s opIndex completely.
>>>>
>>>> Kenji Hara
>>>
>>> How do you overcome this, in the case where you don't know the data type of 'data' (so you don't know what the overloads might look like, maybe because it's a template)?
>>
>> Not quite sure what you mean, but
>>
>>     auto opIndex(A...)(A a) { return data[a]; }
>> 
> What if it's const/pure/@safe/whatever though? Or the parameters have some attributes?

Since it is a function template the attributes are inferred, in this case from
data's opIndex, if any. The arguments are forwarded as-is, ie data's opIndex
has to deal with them.

The return type could be 'auto ref' too, then returning by reference would also
magically work, but this is not always desirable, as it could leak private
references; making return-by-ref explicit is probably safer in cases like this one.

artur


More information about the Digitalmars-d mailing list