Open marehr opened 4 years ago
Okay I figured it out, the problem is that ranges::view_
does not know that std::ranges::view_base
is the "right" view base.
https://eel.is/c++draft/range.view#4
Comparing (std)::ranges::viewable_range
showed that both concepts use a different definition (https://godbolt.org/z/yF9JWq).
So fixing that with
#include <ranges>
#include <string>
#include <range/v3/view/take.hpp>
namespace ranges
{
// std::ranges::views are valid range-v3 views
template<class T>
requires std::derived_from<T, std::ranges::view_base>
inline constexpr bool enable_view<T> = true;
} // namespace ranges
namespace std::ranges
{
// range-v3 views are valid std::ranges::views
template<class T>
requires std::derived_from<T, ::ranges::view_base>
inline constexpr bool enable_view<T> = true;
} // namespace std::ranges
int main()
{
std::string str{"foo"};
auto v3 = str | std::views::take(5) | ranges::view::take(1);
return 0;
}
https://godbolt.org/z/6_BQS3
with
g++10 --std=c++2a
will result in
looking at
https://github.com/ericniebler/range-v3/blob/1334a702e680dd407d53edc6230ee489d07a9186/include/range/v3/view/view.hpp#L122-L139
says something that I don't understand :)