D言語における共用体とVariant

共用体と演算子の多重定義を使って、論理値、整数、実数、複素数、文字列、ポインタを代入できる構造体 Any を作成してみました。でも、実際に使うなら、配列も扱える Variant のほうが便利かも...

any.d
enum Type {VOID, BOOL, LONG, REAL, CREAL, STRING, POINTER}

struct Any {
  Type type = Type.VOID;

  union {
    bool b;
    long l;
    real r;
    creal c;
    string s;
    void* p;
  }

  void opAssign(bool b) {
    type = Type.BOOL;
    this.b = b;
  }

  void opAssign(long l) {
    type = Type.LONG;
    this.l = l;
  }

  void opAssign(real r) {
    type = Type.REAL;
    this.r = r;
  }

  void opAssign(creal c) {
    type = Type.CREAL;
    this.c = c;
  }

  void opAssign(string s) {
    type = Type.STRING;
    this.s = s;
  }

  void opAssign(void* p) {
    type = Type.POINTER;
    this.p = p;
  }
}

void main() {
  Any any;
  any = true;
  any = 10;
  any = 0.1;
  any = 1+2i;
  any = "Hello!";
  any = (int i, int j) => i + j;
}

variant.d
import std.variant;

void main() {
  Variant variant;
  variant = true;
  variant = 10;
  variant = 0.1;
  variant = 1+2i;
  variant = "Hello!";
  variant = (int i, int j) => i + j;
  variant = new int[100];
}

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト /  変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト /  変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト /  変更 )

%s と連携中