阅读量:0
在 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
类型,或者实现隐式转换等功能。