#include <iostream>
#include <string>
#include <concepts> // C++20 concepts header,必须要添加
/*
* concept HasSize 定义了一个名为 HasSize 的约束。
*
* requires(T t) { t.size(); } 是一个 requires 表达式,它创建了一个假想的 T 类型对象 t,然后检查花括号内的语句是否合法
*
*/
template<typename T>
concept HasSize = requires(T t) {// 定义了一个名为 HasSize 的约束
t.size(); // 检查 t.size() 是否合法
};
template <typename T>
concept SayHello = requires(T t) {// 定义了一个名为 SayHello 的约束
{ t.sayHello() } -> std::same_as<void>;
};
// 使用 Concept 约束函数模板
template<HasSize T>
void printSize(const T& t) {
std::cout << "Size: " << t.size() << std::endl;
}
template <SayHello T>
void greet1(const T& obj) {
std::cout << "greet1: "<<std::endl;
obj.sayHello();
}
void greet2(const SayHello auto& obj) {
std::cout << "greet2: "<<std::endl;
obj.sayHello();
}
struct Student {
std::string Name;
int Age;
// 新增size成员函数,满足HasSize约束
size_t size() const {
return sizeof(Name) + sizeof(Age);
}
// 新增sayHello成员函数,满足SayHello约束
void sayHello() const {
std::cout << "Hello, I am " << Name << ", age " << Age << std::endl;
}
};
int main(int arg, char* argv[])
{
//创建Student对象
Student tom("Tom", 20);
Student jerry("Jerry", 18);
//使用concepts约束的函数
greet1(tom);
greet2(tom);
printSize(tom);
printSize(jerry);
std::string buf;
std::cout << "press any key to exit..." << std::endl;
std::cin >> buf;
return 0;
}