日誌列印
OffsetT
OffsetT<float> dragOffset = OffsetT<float>(offsetX, offsetY);
LOGE("aclq dragOffset: %{public}f, %{public}f", dragOffset.GetX(), dragOffset.GetY());
Dimension ==> ConvertToPx() 轉成 double ==> 強轉成 float
float minHeight = static_cast<float>(SINGLE_LINE_TITLEBAR_HEIGHT.ConvertToPx());
double ConvertToPx() const;
WeakPtr 升級為 RefPtr
RefPtr<T> Upgrade() const
std::optional 用法
std::optional 是 C++17 中引入的一個模板類,表示一個可能存在也可能不存在的值。它封裝了一個值,並提供了簡單的介面來判斷該值是否存在。它特別適用於表示函式可能返回有效值或沒有值的情況,避免了使用指標和空值的複雜性。
基本語法
#include <iostream>
#include <optional>
std::optional<int> get_positive_value(bool condition) {
if (condition) {
return 42; // 返回有效的值
} else {
return std::nullopt; // 表示沒有值
}
}
int main() {
std::optional<int> value = get_positive_value(true);
if (value) { // 檢查是否有值
std::cout << "Value: " << value.value() << std::endl;
} else {
std::cout << "No value" << std::endl;
}
return 0;
}
主要功能
1. 構造
- std::optional
obj;:沒有值,預設初始化為 std::nullopt。 - std::optional
obj(value);:初始化幷包含 value。 - std::optional
obj = std::nullopt;:顯式初始化為空。
2. 判斷是否有值
- obj.has_value():返回 true 如果包含有效的值,返回 false 否則
- obj 本身可以當作布林值來判斷是否有值
3. 訪問值
- obj.value():返回儲存的值。如果沒有值,丟擲 std::bad_optional_access 異常
- obj.value_or(default_value):如果有值,返回該值,否則返回 default_value。
4. 修改值
- obj = value:修改值
- obj.reset():清空值,變為無值
5 Demo
# 基本使用
#include <iostream>
#include <optional>
int main() {
std::optional<int> maybeInt; // 預設是無值狀態
if (!maybeInt) {
std::cout << "No value\n";
}
maybeInt = 10; // 給它賦一個值
if (maybeInt) {
std::cout << "Value: " << *maybeInt << std::endl; // 使用解引用運算子來訪問值
}
return 0;
}
// 使用 value_or 提供一個預設值
#include <iostream>
#include <optional>
int main() {
std::optional<int> maybeInt;
// 使用 value_or() 提供一個預設值
int value = maybeInt.value_or(42);
std::cout << "Value: " << value << std::endl; // 輸出:Value: 42
maybeInt = 10;
value = maybeInt.value_or(42);
std::cout << "Value: " << value << std::endl; // 輸出:Value: 10
return 0;
}
// 透過函式返回 optional
#include <iostream>
#include <optional>
std::optional<int> divide(int numerator, int denominator) {
if (denominator == 0) {
return std::nullopt; // 返回沒有值,表示失敗
}
return numerator / denominator; // 返回結果
}
int main() {
std::optional<int> result = divide(10, 2);
if (result) {
std::cout << "Result: " << *result << std::endl;
} else {
std::cout << "Division by zero error\n";
}
return 0;
}
// 使用 reset() 清空 optional
#include <iostream>
#include <optional>
int main() {
std::optional<int> maybeInt = 10;
std::cout << "Before reset: " << *maybeInt << std::endl;
maybeInt.reset(); // 清空值
if (!maybeInt) {
std::cout << "After reset: No value\n";
}
return 0;
}
優勢
- 避免空指標:不需要使用裸指標(nullptr)來表示缺失的值,避免空指標引發的問題。
- 型別安全:在沒有值的情況下,optional 允許你顯式地檢查是否有值。
- 更簡潔的 API:使用 value_or 和 has_value 等介面簡化了程式碼邏輯。
注意事項
- std::optional 並不適用於所有場景,只有在某個值可能缺失時,它才是一個好選擇。對於一些簡單的情況,比如 nullptr 和 -1 用來表示無效值,std::optional 可能會顯得過於複雜。
- 使用 value() 獲取值時,必須確保 optional 確實有值,否則會丟擲異常 std::bad_optional_access。如果不確定是否有值,可以使用 value_or() 提供預設值來避免異常。
std::optional 提供了一種優雅且型別安全的方式來處理可選值,在現代 C++ 程式設計中具有廣泛的應用。