C++ 面试题
目录

C++17 中类模板参数推导 (class template argument deduction) 的用法?

· 约 3 分钟读完 · 第 131 / 181 章

推荐答案

在 C++17 中,类模板参数推导(Class Template Argument Deduction, CTAD)允许编译器根据构造函数参数自动推导模板参数,从而简化代码。以下是一个简单的示例:

在这个例子中,编译器根据初始化列表 {1, 2, 3, 4, 5} 自动推导出 std::vector<int>,而不需要显式指定模板参数。

本题详细解读

1. 什么是类模板参数推导?

类模板参数推导(CTAD)是 C++17 引入的一项特性,它允许编译器根据构造函数的参数自动推导出类模板的模板参数。这意味着在某些情况下,程序员不再需要显式指定模板参数,编译器可以根据上下文自动推导出正确的类型。

2. 如何使用类模板参数推导?

类模板参数推导的使用非常简单,只需在创建类模板对象时省略模板参数即可。编译器会根据传递给构造函数的参数自动推导出模板参数。

例如:

在这个例子中,编译器根据 1 和 2.0 推导出 std::pair<int, double>。

3. 自定义推导规则

在某些情况下,可能需要自定义推导规则。可以通过在类模板定义外部提供推导指引(deduction guides)来实现。

例如:

在这个例子中,我们为 MyContainer 提供了一个推导指引,告诉编译器如何根据构造函数参数推导模板参数。

4. 注意事项

  • 类模板参数推导仅适用于构造函数参数,不能用于其他上下文(如函数返回类型)。
  • 如果类模板有多个构造函数,编译器会根据参数选择最合适的构造函数进行推导。
  • 在某些复杂情况下,可能需要显式指定模板参数以避免歧义。

通过类模板参数推导,C++17 使得模板代码更加简洁易读,减少了冗余的模板参数指定。