如何保证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
相关产品推荐
相关产品推荐

