确定类型是否为Nullable并获取基类型?

时间:2015-02-19 03:37:25

标签: templates d

假设我有这个功能模板:

void bar(T)(T obj) {
    // ...
}

如果T为某个Nullable!U,我想更改该函数的行为,以便如果obj.isNulltrue,我会执行一些备用流程,或者否则继续,就好像已经通过普通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));
}

有没有办法检查TNullable的实例,如果是,请获取包装类型?

或者更一般地说,有没有办法检查类型T是否是某个模板Foo的实例化,并获取模板参数?

2 个答案:

答案 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,...)

代码:http://dpaste.dzfl.pl/cc225c8d4ca3