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{}; }