Do C++ ranges support projections in views?(C++范围支持视图中的投影吗?)
问题描述
我知道Range中的算法(例如sort)支持投影,但在我看来,没有办法获得视图的这种功能...
我说的对吗?
以following working code为例:
#include <algorithm>
#include <ranges>
#include <vector>
#include <iostream>
enum Color {
Red,
Green,
Blue
};
struct Cat {
int age;
Color color;
};
int main() {
std::vector<Cat> cats{{.age = 10,.color=Color::Red}, {.age = 20,.color=Color::Blue}, {.age = 30,.color=Color::Green}};
auto is_red = [](const auto& cat) {return cat.color == Color::Red;};
for (const auto& cat: cats | std::views::filter(is_red)) {
std::cout << cat.age << std::endl;
}
}
有没有办法删除lambda并执行如下操作:
for (const auto& cat: cats | std::views::filter(&Cat::color, Color::Red) {
注意:我的问题是关于成员变量投影,但显然在实际代码中也需要成员函数调用。
推荐答案
C++范围是否支持视图中的投影?
否(尽管Range-v3执行了†)。
有没有办法删除lambda并执行如下操作:
std::views::filter(&Cat::color, Color::Red)
无论如何,这不会真的是投影的工作方式。应该是:
filter([](Color c){ return c == Color::Red; }, &Cat::color)
如果您有一个equals返回谓词:
filter(equals(Color::Red), &Cat::color)
但在算法中添加投影是不必要的。您始终可以手动提供投影。使用Boost.Hof的适当命名的proj函数适配器,该适配器满足proj(p, f)(xs...) == f(p(xs)...)(即,我们在将每个参数传递到f之前对其应用p):
filter(proj(&Cat::color, [](Color c){ return c == Color::Red; }))
或更短:
filter(proj(&Cat::color, _ == Color::Red))
Demo。
†即使在range-v3 implementation中,remove_if_view也不是明确支持投影。它是接受投影的重载手动将谓词组成为compose(pred, proj)。在Range-v3中,compose(f, g)(xs...)可以表示f(g(xs...))或f(g(xs)...),具体取决于g的调用方式。所以在这种情况下,它是一个投影,而不是函数组合。在Boost.Hof中,这两种情况有不同的compose和proj适配器。
这篇关于C++范围支持视图中的投影吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:C++范围支持视图中的投影吗?
基础教程推荐
- 如何通过C程序打开命令提示符Cmd 2022-12-09
- 如何在 C++ 中初始化静态常量成员? 2022-01-01
- 这个宏可以转换成函数吗? 2022-01-01
- 常量变量在标题中不起作用 2021-01-01
- 在 C++ 中计算滚动/移动平均值 2021-01-01
- 静态库、静态链接动态库和动态链接动态库的 .lib 文件里面是什么? 2021-01-01
- 我有静态或动态 boost 库吗? 2021-01-01
- C++结构和函数声明。为什么它不能编译? 2022-11-07
- 如何检查GTK+3.0中的小部件类型? 2022-11-30
- 如何将 std::pair 的排序 std::list 转换为 std::map 2022-01-01
