如何在C++中创建概念以检查所有给定类型参数是否互不相同?
实现检查所有类型参数互不相同的Concept
你已经实现了检查第一个类型参数与其余所有类型参数不同的different概念:
#include <concepts> template<typename TYPE, typename... TYPES> concept different = ((!std::same_as<TYPE, TYPES>) && ...);
要实现所有给定类型参数彼此都互不相同的概念,有两种直观的实现方式:
方式一:递归复用已有概念
利用递归思路,先检查第一个类型和剩余所有类型都不同,再递归验证剩余类型是否也满足全不同,同时处理边界情况:
// 边界情况:0个或1个类型时,天然满足互不相同 template<typename... TYPES> concept all_different = (sizeof...(TYPES) <= 1); // 递归检查:第一个类型与其余所有不同,且剩余类型也满足全不同 template<typename FIRST, typename SECOND, typename... REST> concept all_different = different<FIRST, SECOND, REST...> && all_different<SECOND, REST...>;
这种方式逻辑清晰,复用了已有的different概念,容易理解。
方式二:纯折叠表达式实现
如果不想依赖递归,也可以用嵌套折叠表达式直接完成检查,对每个类型都验证它与后续所有类型不同:
#include <concepts> template<typename... TYPES> concept all_different = []<typename... Ts>(Ts...) { // 对每个类型Ts,检查它与后面所有类型Us都不同 return (([]<typename T, typename... Us>(T, Us...) { return ((!std::same_as<T, Us>) && ...); }(Ts{}, Us{}...)) && ...); }(TYPES{}...);
这种方式不需要额外前置概念,通过lambda和模板参数推导直接完成全量检查。
内容的提问来源于stack exchange,提问作者AKL
相关产品推荐
相关产品推荐

