泛型 concept —— 之 最简单的 Concept 定义与使用

#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;
}


posted @ 2026-08-14 17:48  长松入霄汉远望不盈尺  阅读(5)  评论(0)    收藏  举报