C++ 显示任何容器元素的通用功能

C++ 显示任何容器元素的通用功能,c++,containers,C++,Containers,如何将项目呈现到任何容器的屏幕上 我知道你可以用函数重载,但是你可以为不同类型的容器得到很多函数。这是一个棘手的问题,我们可以枚举所有的容器类型并向它们添加打印函数。对于客户容器,需要添加宏以添加操作符 您可以为不同类型的容器提供很多函数 如果使用模板,则不会 仅匹配您可以迭代的内容: template <std::ranges::range R> std::ostream& operator<<(std::ostream& os, const R &am

如何将项目呈现到任何容器的屏幕上


我知道你可以用函数重载,但是你可以为不同类型的容器得到很多函数。

这是一个棘手的问题,我们可以枚举所有的容器类型并向它们添加打印函数。对于客户容器,需要添加宏以添加
操作符
您可以为不同类型的容器提供很多函数

如果使用模板,则不会

仅匹配您可以迭代的内容:

template <std::ranges::range R>
std::ostream& operator<<(std::ostream& os, const R & range) {
    for (auto & elem : range) {
        os << elem;
    }
    return os;
}
模板

ostream&operatorI不认为有一种解决方案适用于任何容器。主要是因为堆栈和队列没有迭代器。还有一个概念,即存储在容器中的每种可能的类型都可以“呈现”。这假设了一些通用方法,如
运算符。例如at使用
std::for_each(nums.cbegin(),nums.cend(),print)显示容器中的所有项操作符
template <std::ranges::range R>
std::ostream& operator<<(std::ostream& os, const R & range) {
    for (auto & elem : range) {
        os << elem;
    }
    return os;
}
template <typename T>
concept is_tuple = requires { typename std::tuple_size<T>::type; };

template <is_tuple T, std::size_t... Is>
std::ostream& print_tuple(std::ostream& os, const T & tuple, std::index_sequence<Is...>) {
    return os << ... << get<Is>(tuple);
}

template <is_tuple T>
std::ostream& operator<<(std::ostream& os, const T & tuple) {
    return print_tuple(os, tuple, std::make_index_sequence<std::tuple_size_v<T>>{});
}