我在设计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替代方案。
答案 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)
如果你真的需要保留原始结构,那么你可以创建一个类层次结构,它们包含指向结构的指针并相应地发送。