mirror of
https://github.com/changkun/modern-cpp-tutorial.git
synced 2025-12-18 05:04:39 +03:00
see #2: move non-type template param auto to ch02
This commit is contained in:
@@ -12,49 +12,9 @@ order: 10
|
||||
|
||||
本章对即将到来的 C++17 进行介绍,几个月前(2016 年),目前为止,还没有一个正式发布的编译器来编译 C++17 特性的代码,本节作为扩展主题,供对 C++ 的历史进程及其未来发展感兴趣的读者阅读。
|
||||
|
||||
## 10.1 主要入选特性
|
||||
|
||||
### 非类型模板参数的 auto
|
||||
|
||||
模板参数分为两种,一种是类型模板参数,也是我们用得最多的一种:
|
||||
|
||||
```cpp
|
||||
template <typename T, typename U>
|
||||
auto add(T t, U u) {
|
||||
return t+u;
|
||||
}
|
||||
```
|
||||
|
||||
里面的 `T` 和 `U` 都是类型模板参数。另一种是非类型模板参数,它可以让不同的字面量成为模板的参数:
|
||||
|
||||
```cpp
|
||||
template <typename T, int BufSize>
|
||||
class buffer_t {
|
||||
public:
|
||||
T& alloc();
|
||||
void free(T& item);
|
||||
private:
|
||||
T data[BufSize];
|
||||
}
|
||||
|
||||
buffer_t<int, 100> buf; // 100 作为模板参数
|
||||
```
|
||||
|
||||
遗憾的是我们在编写模板的时候就必须明确非类型模板参数的具体类型,C++17 打破了这一限制,让我们能够在非类型模板参数中使用 `auto` 关键字,从而让编译器推导具体的类型:
|
||||
|
||||
```cpp
|
||||
template <auto value> void foo() {
|
||||
return;
|
||||
}
|
||||
|
||||
foo<10>(); // value 被推导为 int 类型
|
||||
```
|
||||
|
||||
## 10.2 未入选特性
|
||||
|
||||
C++ 组委会在讨论投票最终确定 C++17 有很多提案,诸如 **Concepts**/**Ranges**/**Module** 等等,其中最受关注的就是 **Concepts**,可惜这一提案最终被拒,作为技术规范(Technical Specifications, TS) 将其发布。
|
||||
|
||||
### Concepts TS
|
||||
## Concepts TS
|
||||
|
||||
**Concepts** 是对 C++ 模板编程的进一步增强扩展。简单来说,**Concepts** 是一种编译期的特性,它能够让编译器在编译期时对模板参数进行判断,从而大幅度增强我们在 C++ 中模板编程的体验。使用模板进行编程时候我们经常会遇到各种令人发指的错误,这是因为到目前为止我们始终不能够对模板参数进行检查与限制,例如下面简单的两行代码会造成大量的几乎不可读的编译错误:
|
||||
|
||||
|
||||
Reference in New Issue
Block a user