日誌列印

爱新觉罗LQ發表於2024-11-19

日誌列印

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;
}

優勢

  1. 避免空指標:不需要使用裸指標(nullptr)來表示缺失的值,避免空指標引發的問題。
  2. 型別安全:在沒有值的情況下,optional 允許你顯式地檢查是否有值。
  3. 更簡潔的 API:使用 value_or 和 has_value 等介面簡化了程式碼邏輯。
    注意事項
  • std::optional 並不適用於所有場景,只有在某個值可能缺失時,它才是一個好選擇。對於一些簡單的情況,比如 nullptr 和 -1 用來表示無效值,std::optional 可能會顯得過於複雜。
  • 使用 value() 獲取值時,必須確保 optional 確實有值,否則會丟擲異常 std::bad_optional_access。如果不確定是否有值,可以使用 value_or() 提供預設值來避免異常。
    std::optional 提供了一種優雅且型別安全的方式來處理可選值,在現代 C++ 程式設計中具有廣泛的應用。

相關文章