2014-12-02 8 views
2

size_t 또는 null ("나는 어쩌면 유형"을 의미하는) 값 유형을 정의하려고합니다. ? 내가 그렇게 (이상적으로, 나는 그것을 템플릿을 만들 수 있도록하고 싶습니다 그런 일을 구현하는 것이 어떻게어쩌면 유형 D

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

: 내가 할 수 있기를 원하는 것은 관련 유형 Maybe!size_t이다이 같은 (이다 나는 다른 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" 
}