我正在使用范围库来帮助我的类中的文件管理器数据,如下所示:
class MyClass
{
public:
MyClass(std::vector<int> v) : vec(v) {}
std::vector<int> getEvens() const
{
auto evens = vec | ranges::views::filter([](int i) { return ! (i % 2); });
return std::vector<int>(evens.begin(), evens.end());
}
private:
std::vector<int> vec;
};
Run Code Online (Sandbox Code Playgroud)
在这种情况下,函数中构造了一个新向量getEvents()。为了节省这种开销,我想知道是否可以/建议直接从函数返回范围?
class MyClass
{
public:
using RangeReturnType = ???;
MyClass(std::vector<int> v) : vec(v) {}
RangeReturnType getEvens() const
{
auto evens = vec | ranges::views::filter([](int i) { return ! (i % 2); });
// ...
return evens;
}
private:
std::vector<int> vec;
};
Run Code Online (Sandbox Code Playgroud)
如果可能的话,我是否需要考虑任何终生注意事项? …
C++23 引入了非常强大的ranges::to从范围构造对象(通常是容器)的功能,具有以下定义([range.utility.conv.to]):
template<class C, input_\xc2\xadrange R, class... Args> requires (!view<C>)\n constexpr C to(R&& r, Args&&... args);\nRun Code Online (Sandbox Code Playgroud)\n请注意,它仅限制模板参数C不是 a view,也就是说,C甚至可能不是 a range。
然而,它的实现用于range_value_t<C>获取 的元素类型C,这C至少使得模板参数必须对 a 进行建模的给range定约束。range_value_tRrange
那么,为什么ranges::to对模板参数的约束如此宽松C?
我注意到论文的 R3 版本过去常常约束C为input_range,这显然是合理的,因为input_range保证了 是range_value_t格式良好的,但在 R4 中这个约束被删除了。而且我没有找到任何关于此更改的评论。
C那么,消除必须的约束有哪些考虑因素呢input_range?
有没有一个实际的例子来说明这种约束放松的好处?
\n