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

Col*_*Two 3 templates d

假设我有这个功能模板:

void bar(T)(T obj) {
    // ...
}
Run Code Online (Sandbox Code Playgroud)

我想改变函数的行为,如果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));
}
Run Code Online (Sandbox Code Playgroud)

有没有办法检查是否T是一个实例Nullable,如果是,得到包装类型?

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

Ry-*_*Ry- 5

您可以为Nullables 提供特定的重载:

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));
}
Run Code Online (Sandbox Code Playgroud)