我正在阅读 cppreference.com 上的 std::algorithm 文档,我注意到很多我还没有使用过的很酷的东西上有一个 C++17 标签。最引起我注意的是 新的执行政策。 我从阅读它们中收集到的是,我可以通过指定执行策略来制作任何想要多线程的 for_each
循环。
例如,我有一个程序可以输出带有 2D 图形的图像。
int main(){
std::for_each(
img.buffer().begin(),
img.buffer().end(),
renderer(
{-0.5, 0.0, 2.666, 2.0, M_PI / 2.0, 0.0},
img,
16
)
);
fout << img;
}
如果我想让这个程序多线程,我应该可以用一行来完成。
int main(){
std::for_each(
std::execution::par_unseq, // c++17 feature
img.buffer().begin(),
img.buffer().end(),
renderer(
{-0.5, 0.0, 2.666, 2.0, M_PI / 2.0, 0.0},
img,
16
)
);
fout << img;
}
However when I first tried this (with g++ -std=c++17
) I got an error telling me that ‘std::execution’ has not been declared
, so I tried adding #include <execution>
but it says execution: No such file or directory
.我也试过 #include<experimental/algorithm>
而不是 #include<algorithm>
但我得到了相同的结果。我该如何使用这个新功能?
原文由 Willy Goat 发布,翻译遵循 CC BY-SA 4.0 许可协议
c++17 尚未最终确定。并且各种编译器还没有完全实现它。
-std=c++17
意思是“给我你已经完成的所有 C++17”,而不是“成为一个完全有效的 C++17 编译器”。此时您的编译器和/或标准库不支持此功能。几周/几个月/几年后再回来查看。
没有普遍接受的“如果你完全支持,请给我 C++17,否则给我一个错误”标志,你可以传递给编译器;部分原因是它几乎没有实际用途。如果他们提供的 C++17 子集足够,那么你就赢了。如果您需要一个完全兼容的编译器,特定版本的编译器不知道它们是否有错误,因此您无论如何都不能信任该标志,并且必须针对编译器版本对其进行测试。而且,如果您已经知道哪些版本的编译器具有足够有效的 C++17,则不需要标志来告诉您。