【发布时间】:2020-12-02 00:25:48
【问题描述】:
我希望能够通过打印任何std::list 迭代器的值来打印它。我的初始代码如下所示:
template<typename T>
std::ostream& operator<<(std::ostream& os, const typename std::list<T>::const_iterator& x)
{
return os << "&" << *x;
}
这不起作用,因为编译器无法确定参数T。然后,我尝试使其对迭代器类型本身具有通用性,并使用iterator_traits 将其限制为迭代器。
template<
typename It,
typename = typename std::iterator_traits<It>::value_type
>
std::ostream &operator<<(std::ostream &os, const It &x)
{
return os << "&" << *x;
}
但是,当然,我得到了std::ostream << *const char 的两个相互冲突的实现,因为指针也是迭代器。
如何将实现限制为 std::list 迭代器,以免发生冲突?
【问题讨论】:
-
如果您将迭代器传递给函数,您将永远无法知道它来自哪个容器。这就是迭代器的全部目的,你不需要知道容器是什么,只需要知道你有什么样的迭代器。您可以将您的功能限制为
LegacyBidirectionalIterator,这是std::list使用的,但为什么呢?
标签: c++ templates iterator c++17 c++-standard-library