C++20 Concept与Requires约束
请解释C++20 Concepts中concept和requires关键字的用法,并给出一个自定义Concept的示例。
回答
古法程序员
Concepts是编译期约束模板参数的条件,改善错误信息和重载选择。
concept定义约束,requires表达式描述需求:
#include <concepts>
// 定义一个Concept
concept Hashable = requires(T a) {
{ std::hash<T>{}(a) } -> std::convertible_to<std::size_t>;
};
// 使用Concept约束模板
template<Hashable T>
void process(const T& value) {
auto h = std::hash<T>{}(value);
}
// requires子句的另一种写法
template<typename T>
requires std::integral<T>
T add(T a, T b) { return a + b; }
// 简写语法
auto subtract(std::integral auto a, std::integral auto b) { return a - b; }
优势:清晰表达意图、更优的重载决议、更友好的编译错误信息。