kubo39's blog

ただの雑記です。

Operator Overloadingによるインデックスアクセスの実現

D言語では任意のユーザ定義型に対して opIndex/opIndexAssign を定義することでインデックスアクセスを実現することができます。

特に注意すべき点などないのですが、インデックスアクセスにおいて $ は特殊な扱いになっているので opDollarオーバーロードも忘れず実装しておきましょう。

Operator Overloading - D Programming Language

import std.stdio : writeln;

class Company
{
  Employee[] employees;

  auto opOpAssign(string op)(Employee employee) if (op == "~")
  {
    employees ~= employee;
  }

  string opIndex(ulong id)
  {
    foreach (e; employees) if (e.id == id) return e.name;
    throw new Exception("Not found entry.");
  }

  void opIndexAssign(string name, ulong id)
  {
    foreach (ref e; employees) {
      if (e.id == id) {
        e.name = name;
        return;
      }
    }
    throw new Exception("Not found entry.");
  }

  size_t opDollar(ulong pos)()
  {
    return employees.length;
  }
}

class Employee
{
  ulong id;
  string name;

  this(typeof(this.tupleof) xs)
  {
    this.tupleof = xs;
  }
}

version(unittest){}
else
void main()
{
  auto company = new Company;
  foreach (i, name; ["kubo38", "kubo39", "kubo40"]) company ~= new Employee(i, name);
  company[1].writeln;     // "kubo39"
  company[1] = "kubo41";
  company[1].writeln;     // "kubo41"
  company[$-1].writeln;   // "kubo40"
}