tk-xleaderのブログ。C++などプログラミングの話題が中心です。
[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
namespace std::range{
namespace __begin_impl_ns{
template<typename T> void begin(T&&) = delete;
template<typename T> void begin(std::initializer_list<T>&&) = delete;
class _begin_functor{
template<typename E, std::size_t size>
static E* impl(E (&arr)[size]){
return arr;
}
template<typename E>
static E* impl(E (&arr)[]){
return arr;
}
template<typename R> requires iterator_type<decltype((std::declval<R&>()).begin())>
static auto impl(R& r){
return r.begin();
}
template<typename R> requires iterator_type<decltype(begin(std::declval<R>()))>
static auto impl(R&& r){
return begin(std::forward<R>(r));
}
public:
template<typename R>
auto operator()(R&& r)->decltype(impl(std::forward<R>(r)))const{
return impl(std::forward<R>(r));
}
};
}
inline constexpr __begin_impl_ns::_begin_functor begin{};
namespace __end_impl_ns{
template<typename T> void end(T&&) = delete;
template<typename T> void end(std::initializer_list<T>&&) = delete;
class _end_functor{
template<typename E, std::size_t size>
static E* impl(E (&arr)[size]){
return arr + size;
}
template<typename E>
static E* impl(E(&arr)[]){
return arr;
}
template<typename R>
requires sentinel_for<decltype((std::declval<R&>()).end()),decltype(ranges::begin(std::declval<R&>()))>
static auto impl(R& r){
return r.end();
}
template<typename R>
requires sentinel_for<decltype(end(std::declval<R>())),decltype(ranges::begin(std::declval<R>()))>
static auto impl(R&& r){
return end(std::forward<R>(r));
}
public:
template<typename R>
auto operator()(R&& r)->decltype(impl(std::forward<R>(r)))const{
return impl(std::forward<R>(r));
}
};
}
inline constexpr __end_impl_ns::_end_functor end{};
}