【发布时间】:2022-02-08 23:47:50
【问题描述】:
编辑 2:
新编辑:看起来 C++20 有一个新的范围库,从功能的角度来看,它可以满足我的需求。如何在 C++17 或更早版本上完成类似的操作?另外,Kotlin 语法糖可能吗?主要是人的例子:
val adam = Person("Adam").apply {
age = 20 // same as this.age = 20 or adam.age = 20
city = "London"
}
编辑 1:
我不知道我的问题是否那么清楚,所以我将使用 Rust 的 map 举一个例子。
这是在 rust 中制作地图的方式:
let newVector = myVector.iter().map(|x|, x * 2)
这就是它在 C++ 中的实现方式
std::string s("hello");
std::vector<std::size_t> ordinals;
std::transform(s.begin(), s.end(), std::back_inserter(ordinals),
[](unsigned char c) -> std::size_t { return c; });
这要冗长得多。
我想添加一些语法糖来做这样的事情:
std::string s("hello");
auto ordinals = my_ns::map(s,[](unsigned char c) -> std::size_t { return c; });
my_ns::map 的实现可能是这样的(我敢肯定这行不通,只是为了说明如何实现)
template<typename T, U>
map(T t, std::function<U> f)
{
std::vector<U> ordinals;
std::transform(t.begin(), t.end(), std::back_inserter(ordinals),
[](U c) -> f(c));
return ordinals;
}
在这种情况下,ordinals 不需要是 std::vector<std::size_t> 类型,它可以是 map 类型,它具有 std::vector<T> 的转换。使用类型映射的原因是能够将 reduce 与映射等函数链接起来。
原始问题
注意:这仅适用于个人项目,我不打算在生产或大多数时间使用 C++ 时使用它。
我最近一直在使用很多 Kotlin,并且正在尝试使用 Rust,我喜欢它们的高级功能。这让我想知道,我可以创建一些语法糖来模拟其中的一些功能吗?
我试图模仿的一些东西(只是一个例子)
锈图:
let newVector = myVector.iter().map(|x|, x * 2)
Kotlin 让
val adam = Person("Adam").apply {
age = 20 // same as this.age = 20 or adam.age = 20
city = "London"
}
val str = "Hello"
str.let {
println("The string's length is ${it.length}")
}
我不打算使用完全相同的语法,但我想知道是否可以执行以下操作:
int[] arr = {1, 2, 3};
auto d_arr = map(arr, [](int x){return x*2}) // maybe return a map type to be able to use .reduce, etc
第一个 kotlin let 示例我不知道该怎么做,但第二个也可以使用 lambdas 解决。
我正在考虑使用新类型并创建到 std::vector 和数组的转换,这与 C# 的 LINQ 的工作原理类似。
感谢任何有关如何执行此操作的提示。
Ps:我知道 std::transform 和其他功能(我可能会在实现时使用它们),但我想要一个比提供的更简单的 API(而且我也认为这会很好个人项目)。
【问题讨论】:
-
是的,如何执行
map(arr, [](int x){return x*2})之类的操作,然后我可以连接对其他函数(如reduce 等)的调用。我基本上想知道一种将语法糖添加到cpp 的好方法,如果有的话是可能的。 -
该死,我需要多学习一些C++20,乍一看这看起来很不错。我已经编辑了我的帖子,试图让问题更清楚。
-
建议改进标题以更具体地与所询问的问题相关
-
“这就是它在 C++ 中的完成方式”似乎不正确:原始示例生成数组的转换副本(如果我理解正确的话),而您的 C++ 版本就地转换。
标签: c++