我在设计D应用程序时遇到了麻烦.也许我的方法完全错了,所以我来这里救你.任何建议,包括完全重写,都是受欢迎的.
我有一些模板类型:
enum Type : byte { Message='!', Integer='@' }
struct Token (T) {
    Type type;
    T value;
}
alias Token!string MessageToken;
alias Token!long   IntegerToken;
我需要一般地处理这些类型:
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);
我该如何达到这个效果?编辑:欢迎OOP替代品.
我自己使用过标记的联合
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;
    }
}
请注意,它们之间没有静态(编译时)差异,但它几乎是最好的,没有继承
你可以添加一些额外的函数,使它看起来更像继承,所以你不需要在struct的函数之外检查类型字段