Templates 可能是D型

Templates 可能是D型,templates,types,type-conversion,d,nullable,Templates,Types,Type Conversion,D,Nullable,我试图定义一个值类型,它要么保存size\u t,要么保存null(这就是我所说的“可能类型”)。我希望能够做到的是这样的事情(其中相关类型是Maybe!size\u t: Maybe!size_t something_which_could_fail (int foo) { if (foo < 0) { return null;} else { return foo;} } phobos库中的可空类型如何 以及D论坛中的一些其他信息: 另一个选项是使用std

我试图定义一个值类型,它要么保存
size\u t
,要么保存
null
(这就是我所说的“可能类型”)。我希望能够做到的是这样的事情(其中相关类型是
Maybe!size\u t

 Maybe!size_t something_which_could_fail (int foo) {
      if (foo < 0) { return null;}
      else { return foo;}
 }

phobos库中的可空类型如何

以及D论坛中的一些其他信息:

另一个选项是使用std.variant.Algebraic。这类似于许多函数式语言中的代数数据类型,但在库中实现。我不确定我会推荐多少这个选项,因为它有时有点迟钝。但是,你可以这样做

Maybe!size_t a = 50;
Maybe!size_t b = null;
import std.variant;
import std.stdio;

//For convenience as typeof(null) has no name
alias Null = typeof(null);

alias Maybe(T) = Algebraic!(T, Null);

void main()
{
    Maybe!int n = 0;
    writeln(n); //Prints "0"

    n = null;
    writeln(n); //Prints "null"

    //Prints "I'm Null!"
    n.visit!(
        (int  i) => writeln("I'm an int!"),
        (Null n) => writeln("I'm Null!"),
    );

    auto m = n.visit!(
        (int  i) =>  i,
        (Null n) => -1,
    );
    writeln(m); //Prints "-1"
}