On 09/19/2015 02:33 AM, OlaOst wrote:
> Here is a class with a templated opIndex method, and an attempt to use it:
>
> class Test
> {
>      int[] numbers = [1, 2, 3];
>      string[] texts = ["a", "b", "c"];
>
>      Type opIndex(Type)(int index)
>      {
>          static if (is(Type == int))
>              return numbers[index];
>          static if (is(Type == string))
>              return texts[index];
>      }
> }
>
> void main()
> {
>      auto test = new Test();
>
>      auto number = test[0]!int; // does not compile, syntax error
>      auto number = test!int[0]; // does not compile, syntax error
>
>      int number = test[0]; // does not compile, cannot deduce type
> }
>
>
> So it is possible to define a templated opIndex method in a class, but
> is it possible to use it? If not, should it be allowed to create
> templated opIndex methods?

Templated opIndex is used for multi-dimensional array indexing. The template arguments define the range of elements:


http://ddili.org/ders/d.en/templates_more.html#ix_templates_more.opIndex%20template

And the spec:

  http://dlang.org/operatoroverloading.html#array-ops

I would prefer the following:

  test.numbers[0];
  test.texts[0];

but in addition to other solutions, here is another experiment:

struct indexFor(T)
{
    size_t idx;
}

class Test
{
    int[] numbers = [1, 2, 3];
    string[] texts = ["a", "b", "c"];

    T opIndex(T)(indexFor!T index)
    {
        static if (is(T == int))
            return numbers[index.idx];
        static if (is(T == string))
            return texts[index.idx];

        assert(false);
    }
}

void main()
{
    auto test = new Test();

    auto number = test[indexFor!int(0)];
}

Ali

Reply via email to