Indexing with an arbitrary type

Alex via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Mon Aug 1 07:46:03 PDT 2016


On Monday, 1 August 2016 at 13:52:56 UTC, Jonathan M Davis wrote:
> An array does not implement RandomAccessFinite, which is an 
> interface that you created. So, a function that takes a 
> RandomAccessFinite is not going to accept an array. A dynamic 
> array will match isRandomAccessRange, but that has nothing to 
> do with interfaces.

It's ok for me to say, that some types do not implement an 
interface to show some abilities, even if the interface, which 
has to be implemented to show the same abilities is 
given/known/public/exposed... etc...
So, I think this part is ok now, I think...

>> But the main question is about the other part, about the
>> constraint to the first parameter to my functions.
>> It seems strange to me to use "isIntegral" here, as this is 
>> some
>> kind of unrelated for something used as an index.
>> Is there anything more appropriate to check? What kind of
>> interface/trait has an index to fulfill?
>
> What's strange? If you want to accept any integer type, then 
> isIntegral!T would do it. A _better_ thing to do would be to 
> make it so that it's just size_t and not templatize the type, 
> since indices really should be size_t normally (and if the 
> system is 32-bit, then isIntegral!T will accept long and ulong, 
> whereas size_t is uint, and if you pass a long, you'll get a 
> compilation error for arrays, since they take size_t for 
> indexing; it won't matter for 64-bit though, since size_t is 
> ulong there). So,
>
> auto f1(R)(size_t index, R range)
>     if(isRandomAccessRange!R)
> {
>     return range[index];
> }
>
> would be better, but aside from the 32-bit issues, isIntegral 
> will work.
>
> - Jonathan M Davis

This goes in a different direction I want to. I don't have 
anything against simplification to size_t, indeed I have it in 
this way currently. But what I want is something like the 
following:

having
     alias MyIndex = int
and
     MyIndex s = MyInd(1);
     writeln(f1(s, arr)); //gives 42, as expected

Now, I want to define a
struct S
{
     int index;
     ??? what else ??? // alias index this; doesn't help
}
and still being able to have
     alias MyIndex = S
and nothing else should be changed.




More information about the Digitalmars-d-learn mailing list