也许是D中的类型

时间:2014-12-02 04:30:49

标签: templates types type-conversion d nullable

我试图定义一个值类型,该类型包含size_tnull(我的意思是'也许类型')。我希望能做的是这样的事情(相关类型是Maybe!size_t

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

我如何实施这样的事情?理想情况下,我希望能够将其设为模板(因此我也可以使用其他Maybe类型),并且可以按照上述方式从可能到非可能的类型进行转换(尽管我不喜欢&#39;如果不可能,请记住类型转换)。如果我可以做这样的事情也会很好:

Maybe!size_t a = 50;
Maybe!size_t b = null;

2 个答案:

答案 0 :(得分:10)

phobos库中的Nullable类型怎么样? http://dlang.org/phobos/std_typecons.html#.Nullable

D论坛中的其他一些信息: D forum thread about Option(Maybe) type

答案 1 :(得分:3)

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

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"
}