I am trying to get the size of a joint_view created from two std::vector. That should give me the sum of the sizes.
#include <range/v3/view/transform.hpp>
#include <range/v3/view/join.hpp>
#include <iostream>
int main()
{
std::vector<int> s0;
s0.push_back(0);
s0.push_back(2);
…
auto sc{s |
ranges::views::transform([](const auto &segment) {return segment;}) | ranges::views::join};
auto nVertices{std::size(sc)};
for (const auto &v : sc) {
std::cout << v << "\n";
https://godbolt.org/z/o3Yzafrfj
However, I am getting a compile error:
<source>: In function 'int main()':
<source>:26:29: error: no matching function for call to 'size(ranges::join_view<ranges::transform_view<ranges::ref_view<std::vector<std::vector<int> > >, main()::<lambda(const auto:7&)> > >&)'
26 | auto nVertices{std::size(sc)};
...
Why can't I ask the size of the range in this case?
Some
ranges
don't provide asize()
function, so callingstd::size()
(which really just calls the member function) is ineffective.With ranges of the Standard Library, you can call
std::distance(std::cbegin(range), std::cend(range))
(resp. withbegin
andend
when the ranges does not provideconst
iterators).With ranges-v3, the method is the same, but with
ranges::distance
.Note that since your range doesn't provide
cbegin
(resp.cend
), you must use the non-const
counterpart as:See it live here: https://godbolt.org/z/j4Eb4svrd