如何用单个模板参数适配std::list与std::forward_list两种容器?
当然可以!
你完全能用单个模板参数同时适配std::list<T>和std::forward_list<T>,核心是利用这两个容器的通用迭代器接口实现统一遍历逻辑。
先看你可能存在的两个原模板示例
#include <list> #include <forward_list> #include <iostream> // 针对std::list的版本 template <typename T> void printList(const std::list<T>& lst) { for (const auto& elem : lst) { std::cout << elem << " "; } std::cout << "\n"; } // 针对std::forward_list的版本 template <typename T> void printList(const std::forward_list<T>& flst) { for (const auto& elem : flst) { std::cout << elem << " "; } std::cout << "\n"; }
合并后的通用模板
直接用一个通用的Container模板参数,只要容器支持范围for循环(或拥有begin()/end()成员函数返回可遍历迭代器)就能正常工作:
template <typename Container> void printList(const Container& container) { for (const auto& elem : container) { std::cout << elem << " "; } std::cout << "\n"; }
如果想更明确地基于迭代器实现,也可以写成:
template <typename Container> void printList(const Container& container) { using ConstIterator = typename Container::const_iterator; for (ConstIterator it = container.begin(); it != container.end(); ++it) { std::cout << *it << " "; } std::cout << "\n"; }
为什么可行?
std::list和std::forward_list都满足以下条件:
- 定义了
const_iterator类型 - 提供
begin()和end()成员函数返回迭代器 - 迭代器支持
++递增和解引用*操作
哪怕std::forward_list的迭代器是单向的forward_iterator,遍历逻辑依然和双向迭代器的std::list通用。
可选:限制仅适配这两种容器(进阶)
如果想避免模板被其他容器误用,可以用C++11的std::enable_if结合类型特性做约束,但作为新手,先从通用版本入手更简单,熟悉模板后再考虑这类限制。
内容的提问来源于stack exchange,提问作者Rango
相关产品推荐
相关产品推荐

