将D模板结构作为常见类型处理

Ped*_*rda 5 templates d

我在设计D应用程序时遇到了麻烦.也许我的方法完全错了,所以我来这里救你.任何建议,包括完全重写,都是受欢迎的.

我有一些模板类型:

enum Type : byte { Message='!', Integer='@' }

struct Token (T) {
    Type type;
    T value;
}

alias Token!string MessageToken;
alias Token!long   IntegerToken;
Run Code Online (Sandbox Code Playgroud)

我需要一般地处理这些类型:

AnyToken genToken(bool cond) {
  if (cond)
     return MessageToken(Type.Message, "nighly builds");
  else
      return IntegerToken(Type.Integer, -42);
}

AnyToken a = genToken(true);
AnyToken b = genToken(false);
Run Code Online (Sandbox Code Playgroud)

我该如何达到这个效果?编辑:欢迎OOP替代品.

rat*_*eak 6

我自己使用过标记的联合

struct Token{
    Type type;
    union{
        string str;
        long integer;
    }
    @property string strMessage()in{assert(type==Type.Message)}body{
        return str;
    }
    @property void strMessage(string s){
        type=Type.Message;
        str=s;
    }
    @property long intMessage()in{assert(type==Type.Integer)}body{
        return integer;
    }
    @property void intMessage(long l){
        type=Type.Integer;
        integer=l;
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,它们之间没有静态(编译时)差异,但它几乎是最好的,没有继承

你可以添加一些额外的函数,使它看起来更像继承,所以你不需要在struct的函数之外检查类型字段