我希望能够通过打印其值来打印任何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
迭代器,以免发生冲突?
最佳答案
您可以将类型限制为iterator
的const_iterator
或std::list
。例如。
template<typename It>
std::enable_if_t<std::is_same_v<It, typename std::list<typename std::iterator_traits<It>::value_type>::iterator> ||
std::is_same_v<It, typename std::list<typename std::iterator_traits<It>::value_type>::const_iterator>
, std::ostream &>
operator<<(std::ostream &os, const It &x) {
return os << "&" << *x;
}
关于c++ - 如何打印通用std::list迭代器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63373400/