日志打印
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: 42maybeInt = 10;value = maybeInt.value_or(42);std::cout << "Value: " << value << std::endl; // 输出:Value: 10return 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++ 编程中具有广泛的应用。