C++ 面试题 目录

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

推荐答案

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

-- -------------------- ---- -------
-------- ----------
-------- --------

--- ------ -
    ----------- - - --- -- -- -- ---  -- -------- ----------------
    --- ----- - - -- -
        --------- -- - -- - --
    -
    ------ --
-

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

本题详细解读

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

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

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

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

例如:

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

3. 自定义推导规则

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

例如:

-- -------------------- ---- -------
-------- --------- --
------ ----------- -
    ------------- -- - -------- --
    - ------
--

-- -------
-------- --------- --
-------------- -- ---------------

--- ------ -
    ----------- ------  -- --- ----------------
    ------ --
-

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

4. 注意事项

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

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

纠错
反馈