求指导:实现读取n维vector的C++模板函数
问题分析与解决方案
你的代码存在几个关键问题:
- 递归时传递的是容器迭代器,但没有对应模板处理迭代器类型,导致编译失败;
- 仅特化了
vector<int>的处理逻辑,但上层多维容器需要通用的容器遍历模板,而非直接跳转到最内层; - 参数采用值传递,会引发大量不必要的容器拷贝。
正确实现思路
通过模板重载+SFINAE区分容器类型与普通元素类型:
- 对普通元素(如
int),直接输出; - 对容器类型(所有具备
begin()成员的类型,包括vector、array等),遍历每个元素并递归调用处理函数,完成多维遍历。
可运行代码
#include <iostream> #include <vector> #include <iterator> // 处理普通元素:直接输出 template<typename T> void read_vectors(const T& elem) { std::cout << elem << " "; } // 处理容器:遍历每个元素递归调用,仅对有begin()的类型生效 template<typename Container> auto read_vectors(const Container& c) -> decltype(std::begin(c), void()) { for (const auto& elem : c) { read_vectors(elem); } std::cout << "\n"; // 每一层容器结束后换行,清晰区分维度 } int main() { std::vector<std::vector<std::vector<int>>> intvectors{{{1,2,3},{4,5,6}},{{7,8,9}, {10,11,12}}}; read_vectors(intvectors); return 0; }
代码说明
- 使用
const T&传递参数,避免容器拷贝,提升效率; - 利用
decltype(std::begin(c), void())实现SFINAE:只有当类型Container能调用std::begin()时,此模板才会被匹配; - 递归遍历每一层容器,直到最内层元素,完成多维vector的读取与输出。
运行后输出:
1 2 3 4 5 6 7 8 9 10 11 12
内容的提问来源于stack exchange,提问作者learning
相关产品推荐
相关产品推荐

