2014-01-20 25 views
1

是否有人制作了一個通用的D結構,它們組合在一起最小 和類型的最大值和默認值 - 以 正確的方式初始化它們?通用限制類型

喜歡的東西

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.max,T.min所以他們 是爲x = min/max(x, ...)邏輯準備。但是上面的代碼 不起作用,因爲init()函數未被調用,並且我不知道爲什麼。而且我不能使用默認成員初始化 ,因爲我想要Limits也可以與類型如SysTime 一起使用,當min和max只在運行時才知道。

我知道std.datetime.span但它不是通用的。

想法任何人?

參見:http://forum.dlang.org/thread/[email protected]#post-dwuiknzqzmjkefnwmnio:40forum.dlang.org

更新

我剛纔讀,我應該使用std.datetime.IntervalTSysTime。這簡化了事情。

回答

3

init函數不會被調用,因爲你永遠不會調用它! D 從來沒有默認構造超出複製初始化程序。做這種事情的方法是@disable this();,使Limits!int x;出現編譯錯誤,迫使用戶用參數調用工廠函數或構造函數來初始化它。

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