On Thu, 14 Sept 2023 at 16:06, Grzegorz Sikorski via Std-Proposals <std-proposals@lists.isocpp.org> wrote:
Thanks all for your answers. I obviously misread the description in https://en.cppreference.com/w/cpp/ranges/filter_view (in other places the overload for a projection is explicitly shown). Yes, this helps a lot and solves one problem. However the original issue I was trying to fix recently was this: https://godbolt.org/z/TW8P5xqxz. I use range-v3 as a polyfill for the missing std::views::chunk_by, maybe this is the problem.

Firstly, std::views::chunk_by is not missing, it's part of C++23 so available if you use -std=c++23


Secondly, your attempts to use it are incorrect, that's why it doesn't work. The argument needs to be a binary predicate, so neither of these is correct:

// Neither of below work:
// auto active_buttons = buttons | ranges::views::chunk_by(&Button::enabled, std::equal_to<bool>{});
// auto active_buttons = buttons | ranges::views::chunk_by(&Button::enabled);

 This works:

auto active_buttons = buttons | std::views::chunk_by([](auto& l, auto& r){ return l.enabled == r.enabled; });

The problem here is not related to lack of support for projections, it's that you need a binary predicate and &Button:enabled is not a binary predicate.


 
On Wed, 13 Sept 2023 at 20:10, Arthur O'Dwyer <arthur.j.odwyer@gmail.com> wrote:
On Wed, Sep 13, 2023 at 11:20 AM Grzegorz Sikorski via Std-Proposals <std-proposals@lists.isocpp.org> wrote:
I started to notice a pattern that appears in many places. Consider a code like this:

struct Button {
  std::string name;
  bool enabled;
};

auto get_enabled(const auto& buttons) {
  return std::ranges::views::filter([](const auto& button) { return button.enabled; });
}

What I find useful is to add something like https://godbolt.org/z/7Y5bdeddd. Projection support could also be useful in some other std::ranges::views namespace members.

Nit: Write `std::views::filter`, not `std::ranges::views::filter`.
Core confusion: Are you asking for C++20 to support std::invoke'ing a member data pointer? Because it already does. Example:
  return std::views::filter(&Button::enabled);

–Arthur
--
Std-Proposals mailing list
Std-Proposals@lists.isocpp.org
https://lists.isocpp.org/mailman/listinfo.cgi/std-proposals