我怎麼會寫爲下面的結構d:模板限制,顯示給定類型是否具有可比性
struct Foo (T, U) {
}
模板約束表明,這兩個T
和U
必須與使用<
?我的意思是兩個T
可以與<
比較,兩個U
可以與<
比較 - 一個T
和U
可以是無法比擬的。
我怎麼會寫爲下面的結構d:模板限制,顯示給定類型是否具有可比性
struct Foo (T, U) {
}
模板約束表明,這兩個T
和U
必須與使用<
?我的意思是兩個T
可以與<
比較,兩個U
可以與<
比較 - 一個T
和U
可以是無法比擬的。
我相信這會做你問什麼,但有可能是一個更簡潔的解決方案:
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) { }
最簡潔我現在能想到的方式是
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))
{...}
但是,如果你在直接使用比較操作,然後簡單地檢查它們編譯計劃就足夠了。