由于范围被合并到 C++ 20 中,我一直在查看标题以查看operator|
范围视图是如何重载的,但我找不到关于如何或在何处实现它的正确轨道。
C(R)
根据我所阅读的内容,相当于R | C
根据https://en.cppreference.com/w/cpp/ranges 。
或者,V(R, F)
等价于R | V(F)
,其中V
是范围适配器对象,R
是可查看范围,并且F
是包括自由函数在内的任何可调用对象。
我已经阅读了运算符重载的基本规则和习语是什么?并且已经知道如何正确地重载运算符,但是我找不到关于需要哪些函数参数或模板参数或语法含义的指南来满足上述实现的要求。
我的意思不是要替换范围适配器中的所有信息,而只是替换其在具有重载的适配器范围上的语法特征operator|
。
另一个是管道之后生成的对象类型必须与容器的类型相同,只要它满足以下概念即可。
我的想法:
template <std::ranges::viewable_range Ran, std::invocable Inv>
auto operator|(Ran cont, Inv func) {
/* ... */
}
一些应用程序(假设我们已经实现了这些功能):
std::vector<int> vect1 {10, 3, 5, 3};
auto new_vect1 = vect1 | myfilter([](auto x){ return x % 3 == 0; });
// where new_vect1 is still `std::vector<int>`
其中myfilter
:
template <std::viewable_range T, std::invocable F>
decltype(auto) myfilter(T container, F func);
但我认为我的想法要么完全错误,要么在某些方面是错误的,其中大部分都被遗漏了。