2014-01-20 4 views
1

최소 및 최대 값 유형을 그룹화하고 기본으로 에서 초기화하는 일반 D 구조를 작성한 사람이 있습니까? 나는 최소 및 최대가 T.max에 초기화 기본하려는일반 제한 유형

뭔가

alias Pair(T) = Tuple!(T, T); 

struct Limits(T) 
{ 
    /* TODO: Fix purity of this by fixing Bytes.value() */ 
    auto init() @trusted /* pure */ nothrow { return tuple(T.max, T.min); } 
    alias _minmax this; 
    Pair!T _minmax; 
} 
auto limits(T)() { return Limits!T(); } 
unittest { 
    Limits!int x; 
    dln(x); 
} 

처럼 T.min는 그래서 그들은 은 x = min/max(x, ...) 논리에 대한 준비가되어 있습니다. 그러나 위의 코드는 init() 함수가 호출되지 않고 I 이 이유를 모르기 때문에 작동하지 않습니다. 그리고 기본 멤버 초기화 을 사용할 수 없습니다. 왜냐하면 이 SysTime 과 같은 유형에서도 작동하기를 원하기 때문입니다. min 및 max는 런타임에만 알 수 있습니다.

나는 std.datetime.span을 알고 있지만 일반적이지 않습니다.

아이디어 누구?

은 참조 : http://forum.dlang.org/thread/[email protected]#post-dwuiknzqzmjkefnwmnio:40forum.dlang.org

업데이트 :

난 그냥 TSysTime 때 내가 std.datetime.Interval을 사용하는 것을 읽었다. 이것은 단순화합니다.

답변

3

init 함수는 호출하지 않기 때문에 호출되지 않습니다! D 절대은 초기화 프로그램을 복사하는 것 이상의 기본 구성을 수행합니다. 이런 종류의 작업을 수행하는 방법은 이며 Limits!int x;을 사용하면 컴파일 오류가 발생하여 사용자가 팩토리 함수 나 생성자를 호출하여 초기화 할 수 있습니다.

struct S { 
    @disable this(); // disable S s; declars 
    this(int min, int max) { ... } // allow S s = S(0, 10); 
}