在 C++ 中,沒有內(nèi)置的 “option” 類型(與 Rust 或其他語言中的 Option
類型相反)
首先,定義一個模板類 Optional
:
#include<iostream>
#include <utility>
template<typename T>
class Optional {
public:
Optional() : hasValue_(false) {}
Optional(const T& value) : hasValue_(true), value_(value) {}
Optional(T&& value) : hasValue_(true), value_(std::move(value)) {}
bool hasValue() const {
return hasValue_;
}
const T& getValue() const {
if (!hasValue_) {
throw std::runtime_error("No value present");
}
return value_;
}
private:
bool hasValue_;
T value_;
};
然后,你可以像下面這樣使用它:
int main() {
Optional<int> a;
Optional<int> b(42);
if (a.hasValue()) {
std::cout << "a has value: " << a.getValue()<< std::endl;
} else {
std::cout << "a has no value"<< std::endl;
}
if (b.hasValue()) {
std::cout << "b has value: " << b.getValue()<< std::endl;
} else {
std::cout << "b has no value"<< std::endl;
}
return 0;
}
這將輸出:
a has no value
b has value: 42
請注意,這是一個簡化的實現(xiàn),并且不包括許多其他語言中的 Option
類型所提供的功能。例如,這里沒有實現(xiàn) map
、andThen
等方法。你可以根據(jù)需要添加這些功能。
另外,C++17 引入了一個新特性 std::optional
,它提供了一種更標(biāo)準(zhǔn)和更完整的方式來處理可能存在或不存在的值。如果你的編譯器支持 C++17,建議使用 std::optional
而不是自己實現(xiàn)一個類似的類。