成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

一個(gè)讓代碼可讀性暴增的現(xiàn)代C++特性,同事看了都說好!

開發(fā)
來看看 C++23 帶來的三個(gè)超酷的魔法技能!就像是給你的 optional 裝備了三件神器一樣。

嘿,小伙伴們!你是否經(jīng)常遇到這樣的煩惱:某個(gè)值它可能存在,也可能不存在,就像薛定諤的貓一樣?

比如說:

  • 想找找配置文件里有沒有那個(gè)神秘的設(shè)置項(xiàng)
  • 在數(shù)據(jù)庫里尋找那個(gè)可能已經(jīng)"蒸發(fā)"的用戶記錄
  • 解析用戶輸入的數(shù)據(jù)(天知道他們會(huì)輸入什么奇怪的東西!)

在 C++17 這位英雄出現(xiàn)之前,我們都是這樣痛苦地處理的:

// ?? 老方法1:用指針來搞定
User* findUser(const string& name) {
    // 找到了就返回指針,找不到就返回 nullptr
    // 但是等等...這個(gè)指針誰來刪啊?記不住刪除的話就內(nèi)存泄漏啦!??
}

// ?? 老方法2:用 pair 大法
pair<User, bool> findUser(const string& name) {
    // 返回一個(gè)值和一個(gè)標(biāo)志位
    // 但是...就算沒找到也要構(gòu)造一個(gè) User 對(duì)象,這不是白白浪費(fèi)資源嘛!??
}

但是!現(xiàn)在有了 std::optional,一切都變得簡(jiǎn)單優(yōu)雅了!

就像給代碼加了魔法一樣,再也不用為這些煩惱而頭疼了!

一、實(shí)戰(zhàn)示例

1. 和數(shù)據(jù)庫玩捉迷藏

#include <optional>
#include <string>

// 用戶類 - 簡(jiǎn)單但夠用 ??
class User {
    std::string name;
    int age;
public:
    User(std::string n, int a) : name(n), age(a) {}
    void sayHi() { std::cout << "我是" << name << "," << age << "歲~" << std::endl; }
};

// 尋找用戶 - 返回 optional ??
std::optional<User> findUser(const std::string& name) {
    if (name == "張三") {
        return User("張三", 25);  // 找到啦! ?
    }
    return std::nullopt;  // 沒找到... ??
}

int main() {
    // 方法1: 直接判斷 - 簡(jiǎn)單粗暴 ??
    if (auto user = findUser("張三")) {
        user->sayHi();  // 張三出現(xiàn)啦!
    }
    
    // 方法2: value_or - 永遠(yuǎn)有備胎 ??♂? 
    auto user = findUser("李四").value_or(User("替補(bǔ)", 18));
}

看,使用 std::optional 讓我們的代碼變得多么優(yōu)雅!再也不用寫那些煩人的空指針檢查了。就像是給代碼裝上了自動(dòng)駕駛系統(tǒng),不管找沒找到用戶,都能優(yōu)雅地處理!

小貼士:

  • value_or() 就像是你的救生圈,隨時(shí)準(zhǔn)備救場(chǎng)
  • 用 if (user) 判斷比 if (user != nullopt) 更簡(jiǎn)潔優(yōu)雅
  • 記住,這不是指針,是更智能的存在!就像是給數(shù)據(jù)穿上了防彈衣 ???

2. 配置小助手:端口號(hào)探險(xiǎn)記

// 我們的端口號(hào)偵探 ??
std::optional<int> parsePort(const std::string& config) {
    // 先看看是不是都是數(shù)字 ??
    if (!std::all_of(config.begin(), config.end(), ::isdigit)) {
        return std::nullopt;  // 發(fā)現(xiàn)不是數(shù)字的字符,任務(wù)失敗!??♂?
    }
    
    // 轉(zhuǎn)換成數(shù)字(這里一定成功,因?yàn)橐呀?jīng)檢查過了)
    int port = std::stoi(config);
    
    // 端口號(hào)體檢時(shí)間!確保它身體健康 ??
    if (port > 0 && port < 65536) {
        return port;  // 這個(gè)端口號(hào)合格,準(zhǔn)許通過!?
    }
    
    return std::nullopt;  // 抱歉,這個(gè)端口號(hào)不合格 ??
}

void startServer() {
    // 如果 8080 端口不行,就啟用我們的替補(bǔ)選手 80 端口!??♂?
    auto port = parsePort("8080")
        .value_or(80);  // 永遠(yuǎn)要有 Plan B!
    
    std::cout << "火箭發(fā)射!?? 服務(wù)器已啟動(dòng)在端口: " << port << std::endl;
}

看,我們的端口號(hào)探險(xiǎn)家變得更加穩(wěn)健了!通過提前檢查輸入字符串,我們優(yōu)雅地避開了異常處理,代碼更加清晰易讀。就像是給我們的小助手配備了 X 光視覺,能提前發(fā)現(xiàn)潛在的問題!???

小提示:

  • 使用 std::all_of 優(yōu)雅地檢查輸入的有效性,比 try-catch 更加直觀
  • value_or() 依然是我們的安全網(wǎng),在解析失敗時(shí)提供默認(rèn)值
  • 范圍檢查確保端口號(hào)在合理區(qū)間內(nèi),保證服務(wù)器的安全運(yùn)行 ???

3. 鏈?zhǔn)秸{(diào)用的魔法 ? (C++23)

// ?? 我們的主角們
std::optional<User> findUser(const std::string& name);          // 尋人啟事
std::optional<std::string> getUserEmail(const User& user);      // 獲取郵箱大師
std::optional<bool> sendEmail(const std::string& email);        // 郵件快遞員

void notifyUser(const std::string& username) {
    // ?? 見證魔法的時(shí)刻!就像雜技演員的完美配合
    auto result = findUser(username)                // 第一位演員:找到用戶
        .and_then(getUserEmail)                     // 第二位演員:獲取郵箱
        .and_then(sendEmail)                        // 第三位演員:發(fā)送郵件
        .value_or(false);                          // ?? 觀眾不滿意就返回 false
        
    if (result) {
        std::cout << "Ta-da! ?? 郵件成功送達(dá)!" << std::endl;
    } else {
        std::cout << "哎呀,表演失敗了... ??" << std::endl;
    }
}

小提示:

  • and_then 就像魔術(shù)師的接力棒,一個(gè)動(dòng)作完成后才會(huì)傳給下一個(gè)
  • 任何一個(gè)環(huán)節(jié)失敗,整個(gè)魔術(shù)表演就會(huì)停止
  • value_or 就像是我們的保底計(jì)劃,魔術(shù)失敗也不會(huì)讓觀眾失望!

二、使用小貼士

(1) 選擇 value_or() 做你的安全網(wǎng)

  • value() 就像個(gè)炸彈,一不小心就會(huì)爆炸(拋異常)
  • value_or() 則像個(gè)可靠的好朋友,永遠(yuǎn)給你準(zhǔn)備好 Plan B 

(2) 條件判斷玩法 - 簡(jiǎn)單又帥氣!

// 像變魔術(shù)一樣優(yōu)雅 ?
if (auto user = findUser("張三")) {
    // 哇!張三出現(xiàn)了!直接用 *user 打招呼
    // 再也不用寫又臭又長的判空檢查啦~
}

(3) optional 是個(gè)神奇的盒子,不是指針!

  • 不用擔(dān)心內(nèi)存泄漏,它會(huì)自己收拾好一切 
  • 值就住在盒子里,不用到處跑來跑去 
  • 就像哆啦A夢(mèng)的口袋,想要的時(shí)候就能拿出來!

三、高級(jí)特性詳解

1. optional 的百變?cè)煨托?/h4>
// 來看看 optional 的各種裝扮!
std::optional<int> op1;               // 空空如也的 optional ??
std::optional<int> op2(std::nullopt); // 明確說"我是空的"的 optional ??♂?
std::optional<int> op3(42);           // 裝著數(shù)字42的 optional ??
std::optional<int> op4 = 42;          // 同上,但寫法更時(shí)髦 ?
std::optional<int> op5(op3);          // 復(fù)制一個(gè)一模一樣的 optional ??

// 最潮的創(chuàng)建方式 - make_optional
auto op6 = std::make_optional(42);    // 讓編譯器自己猜類型,懶人必備!??

小貼士:

  • 就像變形金剛一樣,optional 有多種形態(tài)可以變換!
  • std::nullopt 就像是 optional 的休假狀態(tài) ???
  • make_optional 就像是個(gè)智能助手,幫你省去寫類型的麻煩 ??

2. optional 值的獲取大法

std::optional<std::string> getMessage() {
    return "你好呀~";  // 返回一個(gè)可愛的問候 ??
}

void demo() {
    auto msg = getMessage();
    
    // 1. value() 大法 - 勇者無畏版 ??
    // 警告:這招威力巨大,失手可能會(huì)炸!??
    try {
        std::string str = msg.value();
    } catch(const std::bad_optional_access& e) {
        // 哎呀,炸了... ??
        std::cout << "啊!value() 炸了,快來救火!" << std::endl;
    }
    
    // 2. 星號(hào)(*) 和箭頭(->) 大法 - 忍者偷襲版 ??
    // 溫馨提示:使用前請(qǐng)確認(rèn)目標(biāo)已經(jīng)存在,否則...??
    if (msg) {  // 先用探測(cè)術(shù)確認(rèn)一下
        std::cout << *msg << std::endl;         // 解封印!
        std::cout << msg->length() << std::endl; // 使用飛鏢攻擊!
    }
    
    // 3. value_or() 大法 - 穩(wěn)妥派必備 ???
    // 這招最安全,就算失敗也有替補(bǔ)方案!
    std::string str = msg.value_or("我是替補(bǔ)選手~");  // 永遠(yuǎn)不會(huì)空手而歸!
}

武功秘籍:

  • value() 就像是一招絕技,威力巨大但風(fēng)險(xiǎn)也高 ??
  • 星號(hào)解引用就像是忍者的飛鏢,要確保目標(biāo)存在才能使用 ??
  • value_or() 則是最穩(wěn)妥的功夫,隨時(shí)準(zhǔn)備好了 Plan B ???

記住:真正的高手都喜歡用 value_or(),因?yàn)樗麄冎溃舻们嗌皆冢慌聸]柴燒!??

3. C++23 的魔法三劍客

來看看 C++23 帶來的三個(gè)超酷的魔法技能!就像是給你的 optional 裝備了三件神器一樣~

// 首先,我們需要兩個(gè)可靠的小幫手 ??
std::optional<int> safe_divide(int a, int b) {
    if (b == 0) return std::nullopt;  // 除以0?不存在的!??♂?
    return a / b;
}

std::optional<std::string> number_to_string(int n) {
    return std::to_string(n);  // 數(shù)字變字符串,變變變!?
}

void monadic_demo() {
    // ?? 第一招:transform - 數(shù)值煉金術(shù)!
    auto result1 = safe_divide(10, 2)
        .transform([](int n) { return n * 2; });  
    // 安全除法后再翻倍,就像給數(shù)字開掛一樣!結(jié)果是 optional<int>(10)
    
    // ?? 第二招:and_then - 完美接力賽!
    auto result2 = safe_divide(10, 2)
        .and_then([](int n) { 
            return number_to_string(n); 
        });  
    // 像接力跑一樣,先除法,成功了就轉(zhuǎn)字符串,結(jié)果是 optional<string>("5")
    
    // ?? 第三招:or_else - 神奇替補(bǔ)隊(duì)員!
    auto result3 = safe_divide(10, 0)
        .or_else([]() { 
            return std::optional<int>(0); 
        });  
    // 哎呀,除以0失敗了?沒關(guān)系!替補(bǔ)選手0上場(chǎng)!結(jié)果是 optional<int>(0)
}

魔法使用指南:

  • transform 就像是煉金術(shù),能把值變成另一種值,但保持 optional 的外殼不變
  • and_then 就像是接力跑選手,上一棒成功才會(huì)接力給下一棒
  • or_else 就像是你的替補(bǔ)選手,主力隊(duì)員受傷了它立馬頂上!

有了這三個(gè)法術(shù),處理可選值簡(jiǎn)直就像變魔術(shù)一樣簡(jiǎn)單!再也不用寫那些煩人的 if 判斷啦~

四、optional 的內(nèi)部秘密 - 性能大揭秘

想知道 optional 是怎么把魔法實(shí)現(xiàn)的嗎?讓我們一起來揭開它的面紗!

template<typename T>
class optional {
    bool has_value_;        // 1個(gè)字節(jié)的魔法開關(guān) ???
    alignas(T) char data_[sizeof(T)];  // 數(shù)據(jù)的秘密基地 ??
    // ... 其他神秘咒語 ...
};

optional 的空間管理藝術(shù)

想象一下,optional 就像是一個(gè)精心設(shè)計(jì)的迷你公寓:

(1) 超級(jí)節(jié)省的空間布局

  • 只比原始類型多用了一個(gè)字節(jié)(就是那個(gè)魔法開關(guān))
  • 就像在你的房間里加了個(gè)小小的電燈開關(guān)一樣簡(jiǎn)單!

(2) 完美的內(nèi)存對(duì)齊

  • 數(shù)據(jù)存儲(chǔ)空間會(huì)自動(dòng)對(duì)齊,就像把家具完美擺放在格子里
  • 比如 optional<int> 通常占用 8 字節(jié)(4字節(jié)int + 1字節(jié)標(biāo)志 + 3字節(jié)對(duì)齊填充)

(3) 極速性能表現(xiàn)

  1. 沒有動(dòng)態(tài)內(nèi)存分配,所有數(shù)據(jù)都乖乖待在棧上
  2. 就像所有東西都放在手邊,想拿就拿,超級(jí)方便!

小彩蛋:對(duì)于可以簡(jiǎn)單拷貝的類型(trivially copyable), optional 還會(huì)開啟特殊加速模式,就像給你的代碼裝上了小型火箭推進(jìn)器!

五、優(yōu)秀實(shí)踐錦囊

來看看使用 optional 的幾個(gè)武林秘籍,讓你的代碼更上一層樓!

1. 跟"魔法值"說拜拜


// ?? 這樣寫就像給代碼下咒語,誰知道 -1 是什么意思?
int findIndex() { 
    return -1;  // 這個(gè)魔法值會(huì)讓后人摸不著頭腦!
}

// ? 這樣寫就像水晶球一樣透明,一看就懂!
std::optional<size_t> findIndex() {
    // 找到了就返回索引,找不到就優(yōu)雅地返回 nullopt
    // 再也不用解釋那個(gè)神秘的 -1 是什么意思啦!
}

2. 結(jié)構(gòu)化綁定:完美搭檔

// 就像功夫片里的雙節(jié)棍,一出手就知有沒有!
if (auto [value, success] = getValue(); success) {
    // value 在這里已經(jīng)準(zhǔn)備就緒,可以大顯身手了!
    // 多優(yōu)雅啊,不用再寫又臭又長的判斷了 ??
}

3. 遠(yuǎn)離套娃陷阱

// ?? 這樣寫就像俄羅斯套娃,讓人頭暈眼花
std::optional<std::optional<int>> nested;  // 套娃警告!??

// ?? 這樣寫就清爽多了,簡(jiǎn)單直接!
std::optional<int> better;  // 干凈利落,一目了然!

小貼士:

  • optional 就像是一個(gè)魔法盒子,但不要把盒子套盒子哦!
  • 結(jié)構(gòu)化綁定就是你的好幫手,讓代碼更清晰易讀
  • 記住:簡(jiǎn)單就是美,過度包裝反而會(huì)把事情搞復(fù)雜!

有了這些秘籍,你的代碼一定會(huì)變得更加優(yōu)雅漂亮!讓我們一起告別那些神秘兮兮的魔法值,擁抱現(xiàn)代 C++ 的美好吧!

現(xiàn)在,告別那些又臭又長的返回值檢查吧!讓 std::optional 來拯救你的代碼!

責(zé)任編輯:趙寧寧 來源: everystep
相關(guān)推薦

2024-12-25 16:29:15

2024-04-23 08:01:20

面向?qū)ο?/a>C 語言代碼

2017-10-30 15:22:29

代碼可讀性技巧

2019-06-06 08:48:14

代碼函數(shù)編程語言

2021-10-09 10:24:53

Java 代碼可讀性

2022-03-23 08:01:04

Python語言代碼

2022-08-23 14:57:43

Python技巧函數(shù)

2022-08-29 00:37:53

Python技巧代碼

2021-04-01 16:43:05

代碼可讀性開發(fā)

2024-04-07 10:13:57

C++代碼if-else

2021-01-26 09:18:27

Shell腳本網(wǎng)站

2024-08-02 16:20:06

2024-10-11 06:00:00

Python代碼編程

2024-10-07 10:00:00

Python代碼編碼

2017-12-19 16:24:20

2015-08-27 13:11:18

JavaScript代碼

2020-03-02 19:08:21

JVMJDKJRE

2025-03-17 00:55:00

2017-11-23 10:59:17

程序員代碼編程

2021-04-20 23:44:25

Excel工具Java
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 精品国产精品三级精品av网址 | 91精品国产综合久久婷婷香蕉 | 欧美三级电影在线播放 | 欧美日韩在线视频一区 | 亚洲精品视频在线播放 | 国产丝袜人妖cd露出 | 国产二区三区 | 国产精品久久久久久久久久久久冷 | 草久久免费视频 | 国内毛片毛片毛片毛片 | www.xxxx欧美 | 999久久久| 国产馆 | 9久9久| 免费精品 | 91亚洲精品国偷拍自产在线观看 | 亚洲电影一区二区三区 | 欧美男人天堂 | 久久久久国产精品午夜一区 | 久久久久精 | 欧美日韩一区二区在线播放 | 成人在线电影在线观看 | 成人黄色av网站 | 精品av | 国产色网| 一区视频在线 | 99欧美精品 | 视频在线亚洲 | 成年人黄色小视频 | 国产一级视频免费播放 | 91av在线影院 | 精品视频国产 | 拍戏被cao翻了h承欢 | 国产资源在线视频 | 一区二区三区在线免费观看 | 久久精品欧美视频 | 中文久久 | 欧美日韩电影免费观看 | 亚洲av毛片 | 欧美日韩不卡 | 久久久观看|