range-v3:使用定界符连接管道范围

range-v3: Joining piped ranges with a delimeter

我正在尝试构建 range-v3 库的基本演示:取一些整数,过滤掉奇数,将它们字符串化,然后将它们加入逗号分隔的列表中。例如,{ 8, 6, 7, 5, 3, 0, 9 } 变为 "8, 6, 0"。通过阅读 docs 并通过示例,天真的解决方案似乎类似于:

string demo(const vector<int>& v)
{
    return v |
        ranges::view::filter([](int i) { return i % 2 == 0; }) |
        ranges::view::transform([](int i) { return to_string(i); }) |
        ranges::view::join(", ");
}

但是在 Clang 7 上构建失败,静态断言 "Cannot get a view of a temporary container"。因为我将结果收集到一个字符串中,所以我可以使用急切的版本 - action::join - 而不是:

string demo(const vector<int>& v)
{
    return v |
        ranges::view::filter([](int i) { return i % 2 == 0; }) |
        ranges::view::transform([](int i) { return to_string(i); }) |
        ranges::action::join;
}

但是 eager 版本似乎没有带分隔符的重载。

有趣的是,如果您先将 join 的输入收集到容器中,原始断言就会消失。以下编译并运行良好:

string demo(const vector<int>& v)
{
    vector<string> strings = v |
        ranges::view::filter([](int i) { return i % 2 == 0; }) |
        ranges::view::transform([](int i) { return to_string(i); });
    return strings | ranges::view::join(", ");
}

但这完全违背了驱动如此多库的惰性计算原则。

为什么第一个例子失败了?如果不可行,能否给action::join一个分隔符?

action::join 应该接受分隔符。请随时提交功能请求。这些行动需要很多爱。