相关疑难解决方法(0)

是否可以/建议返回一个范围?

我正在使用范围库来帮助我的类中的文件管理器数据,如下所示:

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++ range-v3 c++20

10
推荐指数
2
解决办法
3222
查看次数

为什么 C++23 Ranges::to 不将容器类型 C 限制为范围?

C++23 引入了非常强大的ranges::to从范围构造对象(通常是容器)的功能,具有以下定义([range.utility.conv.to]):

\n
template<class C, input_\xc2\xadrange R, class... Args> requires (!view<C>)\n  constexpr C to(R&& r, Args&&... args);\n
Run Code Online (Sandbox Code Playgroud)\n

请注意,它仅限制模板参数C不是 a view,也就是说,C甚至可能不是 a range

\n

然而,它的实现用于range_value_t<C>获取 的元素类型C,这C至少使得模板参数必须对 a 进行建模的给range定约束。range_value_tRrange

\n

那么,为什么ranges::to对模板参数的约束如此宽松C

\n

我注意到论文的 R3 版本过去常常约束Cinput_range,这显然是合理的,因为input_range保证了 是range_value_t格式良好的,但在 R4 中这个约束被删除了。而且我没有找到任何关于此更改的评论。

\n

C那么,消除必须的约束有哪些考虑因素呢input_range

\n

有没有一个实际的例子来说明这种约束放松的好处?

\n

c++ range-v3 std-ranges c++23

5
推荐指数
1
解决办法
398
查看次数

标签 统计

c++ ×2

range-v3 ×2

c++20 ×1

c++23 ×1

std-ranges ×1