面试题答案
一键面试#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;
}
实现思路:
- 头文件包含:引入
<concepts>
头文件以支持C++20概念(concepts),<iostream>
用于输出信息。 - 定义概念和类型:
- 已经给定
MyConcept
概念,要求类型X
有一个返回int
类型的someFunction
成员函数。 - 定义
MyType
类及其派生类DerivedFromMyType
,DerivedFromMyType
重写size
成员函数。 - 定义
UType
类,该类满足MyConcept
概念且有getValue
成员函数。
- 已经给定
- 函数模板实现:
- 使用
requires
子句对模板参数T
和U
添加约束。 std::derived_from<T, MyType>
确保T
是MyType
的派生类。MyConcept<U>
确保U
满足MyConcept
概念。- 第三个
requires
子句确保T
的size
成员函数返回值大于U
的getValue
成员函数返回值。
- 使用
- 主函数测试:
- 创建
DerivedFromMyType
和UType
的对象,并调用complexOperation
函数,若满足所有约束则函数会实例化并执行。
- 创建