1. 快速入门

# 1. 快速入门

为了让你对这个新的标准更感兴趣,下面给出几个代码示例,展示了组合使用的语言特性。

如果你觉得这些示例令人困惑或过于复杂,也不用担心。所有新特性都会在后续章节中逐一深入讲解。

# 操作Maps

Part I/demo_map.cpp

#include <iostream>
#include <map>

int main() {
    std::map<std::string, int> mapUsersAge { { "Alex", 45 }, { "John", 25 } };
    std::map mapCopy{mapUsersAge};

    if (auto [iter, wasAdded] = mapCopy.insert_or_assign("John", 26);!wasAdded)
        std::cout << iter->first << " reassigned...\n ";

    for (const auto& [key, value] : mapCopy)
        std::cout << key << ", " << value << '\n ';
}
1
2
3
4
5
6
7
8
9
10
11
12
13

上述代码的输出结果为:

John reassigned...
Alex, 45
John, 26
1
2
3

上述示例使用了以下特性:

  • 第7行:类模板的模板参数推导(Template Argument Deduction for Class Templates)——mapCopy的类型从mapUsersAge的类型推导得出。无需声明std::map<std::string, int> mapCopy{...}
  • 第9行:映射的新插入成员函数——insert_or_assign
  • 第9行:结构化绑定(Structured Bindings)——将insert_or_assign返回的pair解包为不同的变量名。
  • 第9行:if语句的初始化(init if statement)——iterwasAdded仅在包含该if语句的作用域内可见。
  • 第12行:基于范围的for循环中的结构化绑定——我们可以使用keyvalue进行迭代,而不是pair.firstpair.second

# 调试打印

Part I/demo_print.cpp

#include <iostream>

template <typename T> void linePrinter(const T& x) {
    if constexpr (std::is_integral_v<T>)
        std::cout << "num: " << x << '\n ';
    else if constexpr (std::is_floating_point_v<T>) {
        const auto frac = x - static_cast<long>(x);
        std::cout << "flt: " << x << ", frac " << frac << '\n ';
    }
    else if constexpr(std::is_pointer_v<T>) {
        std::cout << "ptr, ";
        linePrinter(*x);
    }
    else
        std::cout << x << '\n ';
}

template <typename... Args> void printWithInfo(Args... args) {
    (linePrinter(args),...); // 逗号运算符上的折叠表达式
}

int main () {
    int i = 10;
    float f = 2.56f;
    printWithInfo(&i, &f, 30);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26

上述代码的输出结果为:

ptr, num: 10
ptr, flt: 2.56, frac 0.56
num: 30
1
2
3

在这里,你可以看到以下特性:

  • 第4、6、10行:if constexpr——用于在编译时舍弃代码,以匹配模板参数。
  • 第4、6、10行:用于类型特性的_v变量模板——无需编写std::trait_name<T>::value
  • 第19行:printWithInfo函数中的折叠表达式(Fold Expressions)。这个特性简化了可变参数模板。在示例中,我们对所有输入参数调用linePrinter()

让我们开始吧!

到目前为止你看到的代码只是冰山一角!继续阅读,你将看到更多内容:语言中的修正、说明、移除的内容(比如auto_ptr),当然还有新内容:常量表达式lambda表达式(constexpr lambda)、if constexpr、折叠表达式、结构化绑定、template<auto>、内联变量、类模板的模板参数推导等等!

上次更新: 2025/04/01, 13:21:34

社区交流

讨论与留言

前往 GitHub Issues →

本留言区仅对应当前文章,欢迎补充观点、提出问题或帮助修正文中疏漏。 留言由 GitHub/Gitalk 提供,需要使用 GitHub 登录。

最近更新
第 1 课:专栏导论与安全边界
07-01
第 3 课:安装编译与调试环境
07-01
第 4 课:第三方库下载、编译与依赖管理
07-01
更多文章>