C++中如何判断模板类型是否为任意类型的std::vector<>
实现方案
要支持任意元素类型的std::vector判断,不能直接用std::is_same_v和固定元素类型的vector做匹配,需要自定义类型萃取来识别所有std::vector实例。
1. 编写std::vector类型萃取
先引入依赖头文件,实现通用的vector判断逻辑:
#include <type_traits> #include <vector> // 主模板:默认判定为非std::vector类型 template <typename T> struct is_std_vector : std::false_type {}; // 偏特化模板:匹配任意元素类型、任意分配器的std::vector实例 template <typename ElemT, typename Allocator> struct is_std_vector<std::vector<ElemT, Allocator>> : std::true_type {}; // 便捷调用变量,和标准库类型判断接口用法一致 template <typename T> inline constexpr bool is_std_vector_v = is_std_vector<T>::value;
2. 修改原函数的分支判断
把原来仅匹配std::vector<std::string>的判断条件,替换为上面实现的通用vector判断即可,分支内的追加逻辑对任意元素类型的vector都生效,无需额外修改:
template <typename T> void MyClass::setData(const std::string& name, const T& value) { // ... 原有前置逻辑 // 任意std::vector类型走追加写入逻辑 if constexpr (is_std_vector_v<T>) { auto temp = someData.get<T>(name); temp.insert(temp.end(), value.begin(), value.end()); someData.set(name, temp); } // 其余类型直接覆盖写入 else { someData.set(name, value); } // ... 原有后置逻辑 }
说明
- 该实现兼容所有合法的
std::vector实例,包括基础类型、标准库类型、自定义类型元素的vector,也支持嵌套vector、自定义分配器的vector场景 - 代码依赖C17的
if constexpr特性,如果需要适配更低C版本,可以通过SFINAE、标签分发、函数重载的方式分离vector和非vector的处理逻辑,核心处理规则不变
内容的提问来源于stack exchange,提问作者el.mojito
相关产品推荐
相关产品推荐

