2014-12-03 49 views

回答

7

我相信這會做你問什麼,但有可能是一個更簡潔的解決方案:

struct Foo (T, U) if (is(typeof(T.init < T.init) : bool) 
        && is(typeof(U.init < U.init) : bool) 
{ } 

你可以清理有點用的模板:

enum bool isSelfComparable(T) = is(typeof(T.init < T.init) : bool); 

struct Foo (T, U) if (isSelfComparable!T && isSelfComparable!U) { } 
2

最簡潔我現在能想到的方式是

struct Foo(T, U) 
    if(is(typeof(T[0] < T[0])) && is(typeof(U[0] < U[0]))) 
{ 
} 

但我可能會聲明它爲

struct Foo(T, U) 
    if(is(typeof(T.init < T.init)) && is(typeof(U.init < U.init))) 
{ 
} 

因爲它更直接。有些人可能會使用靜態數組混淆,而這不是必需的。但從技術上講,這個時間有點短。

murphyslaw's answer: bool部分實際上不是必要的,因爲<不能什麼,但bool造成的,因爲編譯器將<<=>,並>=對用戶自定義類型調用opCmp,所以程序員沒有機會讓它們產生除bool以外的任何內容(當然,對於內置類型,比較運算符產生bool)。但murphyslaw's answer也可以工作。這只是比所需的更詳細。

: bool== bool將被要求,如果你想接受一個謂語,而不是直接使用比較操作符(從那以後,你在處理任意功能)將是主要的地方,那就是通常會在通用在Phobos最終做的算法。例如find的重載之一的簽名是

InputRange find(alias pred = "a == b", InputRange, Element) 
       (InputRange haystack, Element needle) 
    if (isInputRange!InputRange && 
     is (typeof(binaryFun!pred(haystack.front, needle)) : bool)) 
{...} 

但是,如果你在直接使用比較操作,然後簡單地檢查它們編譯計劃就足夠了。

相關問題