Как реализовать `opIndex` в более высоких измерениях? - PullRequest
7 голосов
/ 20 декабря 2011
struct M{
 T opIndex(uint i){ ... }
}

, что дает мне это:

m[i]

но что, если я хочу это в двух измерениях, чтобы я мог сделать:

m[i][j]

в любом случае, чтобы сделать это

1 Ответ

8 голосов
/ 20 декабря 2011

Да, вы можете использовать C ++ способ возврата временного объекта (структура лучше всего подходит для D), который также имеет перегрузку оператора индекса.

Но лучшей идеей в D является использование синтаксиса m[i, j]:

struct S
{
    uint opIndex(uint i, uint j)
    {
        return i + j;
    }
}

void main()
{
    S s;
    assert(s[2, 3] == 5);
}

Если вы все еще хотите использовать m[i][j], вложенная структура дает вам некоторую синтаксическую свободу действий:

struct S
{
    auto opIndex(uint i)
    {
        struct Temp
        {
            uint opIndex(uint j)
            {
                return i + j;
            }
        }

        return Temp();
    }
}

void main()
{
    S s;
    assert(s[2][3] == 5);
}
...