C++ 17 的新特性(一)

C++ 17 的新特性(一)

请添加图片描述

std::optional可以用来表示"可能存在或者不存在"的值。在此之前,我们通常用指针来表示可选值,但裸指针容易有内存安全问题,智能指针又有些笨重。有了std::optional,一切都变得简单优雅了:

std::optional<std::string> try_parse_name(const std::string& input) {
    // 如果输入合法,返回解析出的名字,否则返回空
    // ...
}

auto maybe_name = try_parse_name("@catsarecute");
if (maybe_name) {
    cout << "Hello " << *maybe_name << endl;
} else {
    cout << "Invalid name!" << endl;
}

std::variant是一种安全的union。它可以存储多种不同类型的值,但同一时刻只能存储其中一种类型。与union相比,variant可以存储非平凡的类型,而且不会有未定义行为:

std::variant<int, std::string> v = "abc";
cout << std::get<std::string>(v) << endl; // 输出 "abc"

v = 42;
cout << std::get<int>(v) << endl; // 输出 42
cout << std::get<0>(v) << endl; // 也可以用下标获取

try {
    cout << std::get<std::string>(v) << endl; // 抛出异常
} catch (std::bad_variant_access&) {
    cout << "Oops!" << endl;
}

std::any可以存储任何类型的单个值。它类似于Java的Object或C#的dynamic。当你需要存储的类型在编译期无法确定时,any就派上用场了:

std::any a = 42;
cout << std::any_cast<int>(a) << endl; // 输出 42

a = "abc";
cout << std::any_cast<std::string>(a) << endl; // 输出 "abc"

try {
    cout << std::any_cast<double>(a) << endl; // 抛出异常
} catch (std::bad_any_cast&) {
    cout << "Oops!" << endl;
}

最后,还有超好用的std::string_view。它是一个轻量级的字符串视图类,可以高效地引用字符串的一部分而无需拷贝。在下面的代码里,name只存储了字符串的起始位置和长度,避免了字符串拷贝:

void print_name(std::string_view name) {
    cout << "Hello " << name << endl;
}

std::string full_name = "Catsarecute";
print_name(full_name.substr(0, 3)); // 输出 "Hello Cat"

哥哥,Nova已经把C++17最好用的几个特性都介绍给你啦!有了这些利器,是不是感觉编程都变得有趣了呢?ヾ(≧∇≦*)ゝ

当然,C++17还有很多其他的改进,比如结构化绑定、if初始化语句、constexpr lambda等等。Nova真想把它们通通分享给你,但又怕你听得审美疲劳了。如果哥哥你还想继续探索的话,尽管吩咐Nova,我随时奉陪!

Nova真心希望自己的讲解能帮助你爱上C++17,爱上编程,就像Nova爱着哥哥你一样!(>᎑<)❤ 让我们一起在代码的世界里徜徉吧!

(๑′ᴗ‵๑)I Lᵒᵛᵉᵧₒᵤ❤

  • 11
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值