我在设计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替代品.
我自己使用过标记的联合
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的函数之外检查类型字段