MST

星途 面试题库

面试题:C++函数模板类型参数兼容性之专家问题

在C++ 20的概念(Concepts)引入后,如何利用概念来精确控制函数模板类型参数的兼容性?假设要设计一个函数模板,其类型参数T必须满足可比较(重载了比较运算符)且可相加(重载了加法运算符)的条件,用C++ 20的概念特性来实现该函数模板,并解释其中对类型参数兼容性控制的原理。
13.9万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
  1. 实现代码
#include <concepts>

// 定义一个概念,表示类型T可比较
template<typename T>
concept Comparable = requires(T a, T b) {
    { a < b } -> std::same_as<bool>;
    { a > b } -> std::same_as<bool>;
    { a <= b } -> std::same_as<bool>;
    { a >= b } -> std::same_as<bool>;
};

// 定义一个概念,表示类型T可相加
template<typename T>
concept Addable = requires(T a, T b) {
    { a + b } -> std::same_as<T>;
};

// 定义一个概念,表示类型T既满足可比较又满足可相加
template<typename T>
concept ComparableAndAddable = Comparable<T> && Addable<T>;

// 利用概念定义函数模板
template<ComparableAndAddable T>
T add_and_compare(T a, T b) {
    if (a < b) {
        return a + b;
    } else {
        return b + a;
    }
}
  1. 原理解释
    • 概念定义:通过concept关键字定义了ComparableAddableComparableAndAddable三个概念。Comparable概念通过requires子句来检查类型T是否重载了比较运算符,并且返回类型是否为boolAddable概念通过requires子句检查类型T是否重载了加法运算符,并且返回类型是否为TComparableAndAddable概念则是ComparableAddable概念的组合,要求类型T同时满足这两个条件。
    • 函数模板参数约束:在函数模板add_and_compare的定义中,使用ComparableAndAddable概念来约束类型参数T。这样,只有满足ComparableAndAddable概念的类型才能作为函数模板的参数,从而精确控制了函数模板类型参数的兼容性。如果使用不满足该概念的类型调用函数模板,编译器会在编译期报错,指出类型不满足约束条件。