Untitled
unknown
c_cpp
8 months ago
1.2 kB
5
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 endregionEditor is loading...
Leave a Comment