第五节 · 特殊人格 · 模板特例化
// 没有 Concepts 时的错误信息难以理解
template<typename T>
T add(T a, T b)
{
return a + b;
}
struct Foo {};
int main()
{
add(Foo{}, Foo{}); // 编译错误,但错误信息很长很复杂
return 0;
}#include <concepts>
// 简单的 Concept
template<typename T>
concept Numeric = is_arithmetic_v<T>;
// 使用 requires 表达式
template<typename T>
concept Addable = requires(T a, T b) {
{ a + b } -> same_as<T>; // 要求 a + b 有效且返回 T
};
// 更复杂的约束
template<typename T>
concept Container = requires(T c) {
typename T::value_type; // 要求有 value_type 类型
typename T::iterator; // 要求有 iterator 类型
{ c.begin() } -> same_as<typename T::iterator>;
{ c.end() } -> same_as<typename T::iterator>;
{ c.size() } -> convertible_to<size_t>;
};习题
Last updated