假设我有这个功能模板:
void bar(T)(T obj) {
// ...
}
如果T
为某个Nullable!U
,我想更改该函数的行为,以便如果obj.isNull
为true
,我会执行一些备用流程,或者否则继续,就好像已经通过普通U
类型一样。
void bar(T)(T obj) {
static if(is(T == Nullable!U)) { // ?
if(obj.isNull) {
writeln("Object was null!");
return;
}
auto realObj = obj.get;
} else {
alias realObj = obj;
}
writeln("Object was "~to!string(realObj));
}
有没有办法检查T
是Nullable
的实例,如果是,请获取包装类型?
或者更一般地说,有没有办法检查类型T
是否是某个模板Foo
的实例化,并获取模板参数?
答案 0 :(得分:5)
您可以为Nullable
提供特定的重载:
void bar(T : Nullable!U, U)(T obj) {
if (obj.isNull) {
writeln("Object was null!");
return;
}
bar(obj.get);
}
void bar(T)(T obj) {
writeln("Object was "~to!string(obj));
}
答案 1 :(得分:4)
您的代码大部分都是正确的,您只需更改此行:
static if(is(T == Nullable!U))
到这个
static if(is(T == Nullable!U, U))
,U
将为Nullable
的类型设置别名(即int
,...)