c++ - 如何打印通用std::list迭代器?

标签 c++ templates iterator c++17 c++-standard-library

我希望能够通过打印其值来打印任何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迭代器,以免发生冲突?

最佳答案

您可以将类型限制为iteratorconst_iteratorstd::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/

相关文章:

C#/.NET Timers 和 Win32 Sleep 函数都不准确

c++ - VS 2010 : Why the "Autos" window items appear\disappear in their visibility area?

c++ - 如何让 C++ 模板类调用另一个类的方法?

java - 有没有办法用迭代器只删除列表中的第一个元素?

c++ - 如何更好地处理依赖于模板参数的类成员类型?

c++ - 如何为模板类创建 "factory function"?

c++ - 在模板中使用 -> 以强制以下符号依赖

java - 已删除列表上的有效迭代器?

java - 对于 .next() 在 Java 迭代器中如何在不使用 for 循环的情况下工作感到困惑

c++ - 是否可以让构造函数具有与声明的类不同的名称?