我正在尝试构建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上构建失败,并带有一个静态断言,即“无法获取临时容器的视图”。由于我将结果收集到字符串中,因此可以使用热切的版本-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;
}
但是渴望的版本似乎没有带有分隔符的重载。
有趣的是,如果您首先将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
加上分隔符吗?
答案 0 :(得分:2)
action::join
应该接受定界符。随时提出功能请求。这些动作需要很多爱。