[英]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";
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.