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

时间:2012-02-05 15:17:33

标签: templates d

我在设计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替代方案。

3 个答案:

答案 0 :(得分: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;
    }
}

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

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

答案 1 :(得分:4)

你可以使用std.variant。

我无法想象另一种方式。最后,它们是完全不同的类型。

答案 2 :(得分:2)

如果你真的需要保留原始结构,那么你可以创建一个类层次结构,它们包含指向结构的指针并相应地发送。