Untitled

 avatar
unknown
c_cpp
14 days ago
1.2 kB
4
Indexable
#pragma region template

#include <bits/stdc++.h>

template <typename, typename = void>
struct has_begin_end_t : std::false_type {};

template <typename T>
struct has_begin_end_t<T, std::void_t<
    decltype(std::begin(std::declval<T&>())),
    decltype(std::end(std::declval<T&>()))
>> : std::true_type {};

template <typename, typename = void>
struct has_ostream_t : std::false_type {};

template <typename T>
struct has_ostream_t<T, std::void_t<
    decltype(std::operator<<(std::declval<std::ostream&>(), std::declval<const T&>()))
>> : std::true_type {};

template <typename T>
constexpr bool is_container_v = has_begin_end_t<T>::value && !has_ostream_t<T>::value;

template <typename T>
typename std::enable_if<is_container_v<T>, std::istream&>::type
operator>>(std::istream& is, T& c) {
    for (auto& x : c)
        is >> x;
    return is;
}

template <typename T>
typename std::enable_if<is_container_v<T>, std::ostream&>::type
operator<<(std::ostream& os, const T& c) {
    for (auto it = c.begin(); it != c.end(); it = std::next(it)) {
        if (it != c.begin())
            os << ' ';
        os << *it;
    }
    return os;
}

#pragma endregion
Editor is loading...
Leave a Comment