MST

星途 面试题库

面试题:C++函数模板实例化条件控制之专家难度

给定一个复杂的函数模板 `template <typename T, typename U> void complexOperation(T t, U u)`,要求当 `T` 是某个自定义类型 `MyType` 的派生类,并且 `U` 满足特定的 `concept`(假设已有定义 `template <typename X> concept MyConcept = requires(X x) { { x.someFunction() } -> std::same_as<int>; }`),同时 `t` 和 `u` 满足某种复杂逻辑关系(例如 `t.size() > u.getValue()`,假设 `t` 有 `size` 成员函数,`u` 有 `getValue` 成员函数)时才进行实例化。请详细说明实现思路并写出完整代码,包括必要的头文件等。
34.3万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
#include <concepts>
#include <iostream>

// 假设已有定义
template <typename X>
concept MyConcept = requires(X x) {
    { x.someFunction() } -> std::same_as<int>;
};

class MyType {
public:
    virtual size_t size() const { return 0; }
};

class DerivedFromMyType : public MyType {
public:
    size_t size() const override { return 5; }
};

class UType {
public:
    int getValue() const { return 3; }
    int someFunction() const { return 42; }
};

// 实现复杂函数模板
template <typename T, typename U>
    requires std::derived_from<T, MyType> && MyConcept<U> && requires(T t, U u) {
        { t.size() > u.getValue() };
    }
void complexOperation(T t, U u) {
    std::cout << "Complex operation is being performed." << std::endl;
}

int main() {
    DerivedFromMyType t;
    UType u;
    complexOperation(t, u);
    return 0;
}

实现思路:

  1. 头文件包含:引入<concepts>头文件以支持C++20概念(concepts),<iostream>用于输出信息。
  2. 定义概念和类型
    • 已经给定MyConcept概念,要求类型X有一个返回int类型的someFunction成员函数。
    • 定义MyType类及其派生类DerivedFromMyTypeDerivedFromMyType重写size成员函数。
    • 定义UType类,该类满足MyConcept概念且有getValue成员函数。
  3. 函数模板实现
    • 使用requires子句对模板参数TU添加约束。
    • std::derived_from<T, MyType>确保TMyType的派生类。
    • MyConcept<U>确保U满足MyConcept概念。
    • 第三个requires子句确保Tsize成员函数返回值大于UgetValue成员函数返回值。
  4. 主函数测试
    • 创建DerivedFromMyTypeUType的对象,并调用complexOperation函数,若满足所有约束则函数会实例化并执行。