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

如何保证C++模板参数中每个类型仅出现一次,重复时触发编译错误?

基于现有type_count实现重复类型校验的方案

你只需要额外实现一个参数包无重复类型的校验逻辑,再通过static_assert整合到foo的定义中即可:

1. 实现无重复类型判断函数

根据你使用的C++标准可以选择对应写法:

C++17 及以上(折叠表达式简洁写法)
template <class... Types>
constexpr bool has_unique_types() {
    // 对参数包中每个类型,检查它在全量参数中出现次数恰好为1
    return (... && (type_count<Types, Types...>() == 1));
}
C++11 兼容写法
// 递归终止:空参数包默认无重复
template <class...>
constexpr bool check_unique_impl() {
    return true;
}

// 递归校验:当前类型出现次数为1,且剩余参数也无重复
template <class T, class... Rest>
constexpr bool check_unique_impl() {
    return type_count<T, T, Rest...>() == 1 && check_unique_impl<Rest...>();
}

template <class... Types>
constexpr bool has_unique_types() {
    return check_unique_impl<Types...>();
}

2. 把校验逻辑加到foo定义中

在foo的结构体/类内部加静态断言,触发编译时报错:

template <class... Args>
struct foo {
    static_assert(has_unique_types<Args...>(), "foo模板参数不允许存在重复类型");
    // 此处保留foo原本的实现逻辑
};

效果验证

你定义的using bar = foo<string, string, int>会直接触发编译错误,提示静态断言失败;仅当所有模板参数类型唯一时编译才会通过。

内容的提问来源于stack exchange,提问作者legendaryzyper

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 22:15:07