2014-12-02 68 views
2

我試圖定義一個值類型,它包含一個size_t或一個null(這就是我的意思是'可能類型')。我希望能夠做的就是這樣的事情(在相關類型爲Maybe!size_tD中的可能類型

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

我將如何實現這樣的事情在理想情況下,我希望能夠使它成爲一個模板(這樣的嗎?我也可以有其他的Maybe類型),並且可以像上面那樣從可能轉換到非可能類型(儘管如果這不可能,我不介意類型轉換)。如果我可以做類似的事情也會很好這樣的:?

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

回答

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" 
} 
相關問題