0Pricing
C++ Academy · 课时

在模板和 auto 中使用概念

使用概念约束函数模板和简写函数模板

在模板和 auto 中使用概念 是 CoddyKit 上的免费 C++ Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 C++ Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 C++ Academy 课程共包含 4 节课。

三种语法回顾

您可以通过三种方式应用概念:将其作为模板参数前缀、作为 requires 子句,或使用简写函数模板语法。

前缀语法

用概念名称替换 typename。

template <std::integral T>
T add(T a, T b) { return a + b; }

requires 子句语法

在模板参数列表后添加 requires。灵活性最高,支持复杂条件。

template <typename T>
    requires std::integral<T> || std::floating_point<T>
T add(T a, T b) { return a + b; }

尾随 requires 子句

将 requires 放在函数签名之后——当约束取决于参数时,在成员函数中非常有用。

template <typename T>
class Container {
public:
    void sort() requires std::sortable<T> { /* ... */ }
};

简写函数模板

在参数中使用 auto 并为其添加约束。编译器会在底层合成模板。

void greet(std::convertible_to<std::string> auto name) {
    std::cout << "Hello " << name;
}

多个 auto 参数

每个 auto 都可以拥有自己的概念。每个 auto 都会创建一个独立的模板参数。

auto multiply(std::integral auto a, std::integral auto b) {
    return a * b;
}

带有类模板的概念

同样适用这三种语法。

template <std::movable T>
class Buffer { /* ... */ };

template <typename T>
    requires std::default_initializable<T>
class Storage { /* ... */ };

受约束的 Lambda(C++20)

Lambda 可以使用带有概念的显式模板参数。

auto print = []<std::integral T>(T x) {
    std::cout << x << " is integral";
};
print(42);

基于概念的重载解析

编译器会选择匹配的、约束最严格的重载。更具体的概念优先于不那么具体的概念。

void process(std::integral auto x)       { std::cout << "int\n"; }
void process(std::signed_integral auto x) { std::cout << "signed\n"; }

process(42);    // calls signed_integral version

受约束的成员函数

类模板的成员可以拥有自己的约束。

template <typename T>
class Optional {
    T value_;
public:
    void clear() requires std::is_trivially_destructible_v<T> { /* fast */ }
    void clear() { /* general */ }
};

默认初始化的受约束类型

将 requires 与默认值结合起来,编写简洁且能清晰表达意图的模板。

风格指南

对于常见情况,使用前缀语法。当约束复杂或涉及多个类型时,改用 requires。对于简短、职责集中的函数,使用简写函数模板。

快速检查

“接受任意整数值的函数”对应的简写函数模板语法是什么?

回顾

可以将概念用作前缀、放在 requires 子句中,或用于简写函数模板。匹配的重载中,约束最严格的一个胜出。请选择最简洁且适合场景的语法:简单情况使用前缀,复杂情况使用 requires,简短函数使用简写语法。

常见问题解答

「在模板和 auto 中使用概念」课时是免费的吗?

是的 — 「在模板和 auto 中使用概念」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 C++ Academy 课程的其余内容,请升级到 CoddyKit PRO。 C++ Academy 课程共包含 4 节课。

「在模板和 auto 中使用概念」这节课中我会学到什么?

使用概念约束函数模板和简写函数模板 你通过在浏览器中直接运行的动手代码来练习 C++ Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 C++ Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 C++ Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。

「在模板和 auto 中使用概念」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 C++ Academy 课中编写并运行代码吗?

能。每节 C++ Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 概念为何优于 SFINAE
  2. 使用 requires 定义概念
  3. 在模板和 auto 中使用概念
  4. 常见标准概念:Integral、Ranges
← 返回 C++ Academy