You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用更简洁方式定义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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 20:27:31