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" }