在 C++ 中,創建一個自定義的 Option
類可以讓你更靈活地處理可選值(例如,值可能存在,也可能不存在)
#include<iostream>
#include<variant>
template<typename T>
class Option {
public:
Option() : value_(std::monostate()) {}
Option(const T& someValue) : value_(someValue) {}
bool isSome() const {
return std::holds_alternative<T>(value_);
}
bool isNone() const {
return std::holds_alternative<std::monostate>(value_);
}
T getValue() const {
if (isSome()) {
return std::get<T>(value_);
} else {
throw std::runtime_error("Attempt to get value from a None option");
}
}
private:
std::variant<std::monostate, T> value_;
};
int main() {
Option<int> opt1; // None option
Option<int> opt2(42); // Some option
if (opt1.isNone()) {
std::cout << "opt1 is None"<< std::endl;
}
if (opt2.isSome()) {
std::cout << "opt2 is Some and its value is "<< opt2.getValue()<< std::endl;
}
return 0;
}
這個示例中,我們使用了 C++17 標準中的 std::variant
和 std::monostate
。Option
類模板包含一個私有成員變量 value_
,其類型為 std::variant<std::monostate, T>
。這意味著 value_
可以是一個 std::monostate
(表示沒有值或 None
)或類型為 T
的值。
我們提供了兩個構造函數:一個默認構造函數創建一個 None
選項,另一個接受一個類型為 T
的參數并創建一個 Some
選項。
類中還包含了 isSome()
, isNone()
, 和 getValue()
方法,用于檢查選項是否有值以及獲取選項的值。注意,如果選項為空且調用 getValue()
方法,將會拋出一個異常。
這只是一個簡單的實現,你可以根據需要進行擴展和修改。例如,你可以添加更多的方法來處理 Option
類型,或者實現隱式轉換等功能。