C++ 面试题 目录

C++20 中概念 (concept) 的概念和用法?

推荐答案

在C++20中,概念(concept)是一种用于约束模板参数的机制。它允许程序员在编译时对模板参数进行更精确的类型检查,从而提高代码的可读性和安全性。概念通过定义一组要求来限制模板参数的类型,只有满足这些要求的类型才能被用作模板参数。

基本用法

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

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

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

在这个例子中,Integral 是一个概念,它要求模板参数 T 必须是整数类型。add 函数模板只能接受满足 Integral 概念的类型作为参数。

组合概念

这里,SignedIntegral 是一个组合概念,它要求 T 不仅是整数类型,还必须是有符号的整数类型。

使用标准库中的概念

C++20 标准库提供了许多预定义的概念,例如 std::integralstd::floating_point 等。

在这个例子中,std::integral 是标准库中定义的一个概念,用于约束模板参数为整数类型。

本题详细解读

概念的定义

概念(concept)是C++20引入的一种新特性,用于在编译时对模板参数进行约束。概念本质上是一个布尔谓词,用于检查类型是否满足某些条件。如果类型满足概念的要求,则可以在模板中使用该类型。

概念的语法

概念的语法如下:

其中,ConceptName 是概念的名称,requires 子句用于定义概念的要求。

概念的使用

概念可以用于约束函数模板、类模板和变量模板的参数。例如:

在这个例子中,func 函数模板只能接受满足 ConceptName 概念的类型作为参数。

标准库中的概念

C++20 标准库提供了许多预定义的概念,例如:

  • std::integral:要求类型是整数类型。
  • std::floating_point:要求类型是浮点数类型。
  • std::same_as:要求类型与指定类型相同。
  • std::derived_from:要求类型派生自指定类型。

这些概念可以直接用于模板参数的约束。

概念的优势

  1. 提高代码可读性:概念使得模板参数的要求更加明确,代码更易于理解。
  2. 增强类型安全:概念在编译时进行类型检查,减少了运行时错误的可能性。
  3. 简化错误信息:当模板参数不满足概念要求时,编译器会生成更清晰的错误信息。

示例代码

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

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

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

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

在这个例子中,Printable 概念要求类型 T 必须能够通过 std::cout 进行输出。print 函数模板只能接受满足 Printable 概念的类型作为参数。

纠错
反馈