簡體   English   中英

C++17 模板中的可選運算符重載

[英]Optional operator overloading within a template in C++17

我有一個圍繞std::optional<T>的小包裝類。 我們稱之為MaybeValue<T> 我的目標是能夠在基礎類型上使用標准運算符(如+*< 、...),如果兩個對象都不是“空”:

MaybeValue<int> v1 = 1;
MaybeValue<int> v2 = {};

assert(v1 + v2 == {});
assert(v1 + 1 == MaybeValue<int>(2));

我試圖重載方法MaybeValue<T>::operator+ ,但隨后需要T來實現operator+ 這不是我想要的,因為我希望將MaybeValue<T>與不實現+運算符但實現其他運算符的類型一起使用,例如<

是否可以僅在基礎類型上存在運算符時才重載運算符?

我試圖重載方法MaybeValue::operator+,但隨后需要T 來實現operator+。 這不是我想要的,因為我希望將 MaybeValue 與不實現 + 運算符但實現其他運算符的類型一起使用,例如 <。

一種選擇是什么都不做。 通過隱式實例化,類模板的方法只有在被調用時才會實例化; “除非在程序中使用該成員,否則它不會被實例化” (但是,如果類被顯式實例化,例如template class MaybeValue<int>; ,那么類中的所有東西都會被實例化。)如果 T 不支持 +,那么MaybeValue<T>使用MaybeValue<T>就可以了MaybeValue<T>::operator+永遠不會被調用。 如果操作調用,那么編譯錯誤彈出抱怨MaybeValue<T>::operator+以及該實例它得罪調用代碼,這樣你就知道需要什么固定。

但是,如果您想更有意地禁用不受支持的操作,則根據類型有條件地定義函數的標准解決方案是SFINAE 或 "Substitution Failure Is Not An Error" 一個很好的工具是std::enable_if或 (C++17 起) std::void_t 例如,來自 std::enable_if 頁面的這個示例定義了一個“構造”函數,但僅適用於可簡單構造的 T:

// #1, enabled via the return type
template<class T>
typename std::enable_if<std::is_trivially_default_constructible<T>::value>::type 
    construct(T*) 
{
    std::cout << "default constructing trivially default constructible T\n";
}

std::tie 用於 C++17 結構運算符<!--?</div--><div id="text_translate"><p> 考慮以下 C++17 結構:</p><pre> struct S { M1 m1; M2 m2; M3 m3; bool operator<(const S& that) const { return tie() < that.tie(); } auto tie() const { return std::tie(m1,m2,m3); } };</pre><p> 這個對嗎? S::tie會返回成員引用的元組,還是會復制一份? 會自動推斷出正確的類型(引用元組)嗎? constness 做正確的事嗎?</p><p> (我看到的示例對 std::tie 進行了兩次調用,並且沒有像這樣分解為單獨的成員 function。想知道/懷疑是否有原因。)</p></div>

[英]std::tie for C++17 struct operator<?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM