如何用更简洁方式定义C++ Concept判断类型为指定类型之一?
更简洁的C++ Concept写法:判断类型是否属于指定集合
你可以通过两种更简洁的方式实现需求,避免重复书写std::same_as:
方法一:通用折叠表达式封装
先定义一个通用的IsOneOf概念,利用C++17引入的折叠表达式简化类型匹配逻辑,后续复用或扩展都很方便:
#include <concepts> #include <cstdint> // 通用概念:判断T是否是Ts中的某一种类型 template <typename T, typename... Ts> concept IsOneOf = (std::same_as<T, Ts> || ...); // 你的目标概念,直接复用IsOneOf template <typename T> concept IsMySupportedType = IsOneOf<T, std::int32_t, std::int64_t, float, double>;
这种方式的好处是IsOneOf可以作为通用工具在其他场景复用,后续要新增支持类型,只需要在参数包中添加即可,无需修改核心逻辑。
方法二:利用std::disjunction类型特性
如果不想额外定义通用概念,也可以直接用C++17的std::disjunction(编译期逻辑或特性)结合std::is_same来实现:
#include <concepts> #include <cstdint> #include <type_traits> template <typename T> concept IsMySupportedType = std::disjunction_v< std::is_same<T, std::int32_t>, std::is_same<T, std::int64_t>, std::is_same<T, float>, std::is_same<T, double> >;
std::disjunction_v会在编译期依次判断每个std::is_same的结果,只要有一个为真就返回true,写法上比原代码更紧凑。
内容的提问来源于stack exchange,提问作者NicholasM
相关产品推荐
相关产品推荐

