c++ - 可移植地支持宽松的循环范围

标签 c++ foreach range c++17 forward-compatibility

C++17 将(可能)relax the definition of the range for loop ,允许 end() 返回不同的类型(例如哨兵):

struct MyRange {
    struct Sentinel {};
    int* begin();
    Sentinel end();
};
bool operator!=(int*, MyRange::Sentinel);

目前唯一支持此功能的编译器是 gcc 6.1 和 clang 4.0+ ( example ) ( example of error message )。如果我正在编写一个范围类型,其中哨兵​​对于结束类型会更有效,我如何检测编译器是否支持松弛范围?我在 P0184R0(上面链接)中看不到对此的任何讨论;是否会提供功能测试宏?

进一步的问题:

  • 如果有检测编译器支持的方法,更改我的 end() 成员函数的返回类型是否安全(对于库)?我需要吗?使我的哨兵隐式转换为我的迭代器类型?
  • 相反,对于 C++17 之前的编译器,是否值得以不同的名称公开我的哨兵(例如 sentinel())? C++17 之前的算法能否有效地使用 [begin(), sentinel()) 还是不值得额外的代码?

最佳答案

根据 P0096R3 ,您可以检查 __cpp_range_based_fo‌ r 是否大于或等于 201603。当然,Visual Studio 不支持任何功能测试宏,因此您将拥有单独检查其版本控制。他们在 VS2015 Update 3 中提供了对它的支持,但与大多数其他 C++17 支持一起,您必须使用 /std:c++latest 开关。

关于c++ - 可移植地支持宽松的循环范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38957468/

相关文章:

c++ - 从 C++ 使用 netlink 的最佳方法是什么?

c++ - 是否存在用于文件系统事件的跨平台库?

php - Foreach 仅返回数组的第一个值

html - 将范围及其标签置于 div 中同一级别的中心

c - 确定两条线段是否与公差相交

c++ - 静态库链接失败,共享库链接成功

php - in_array() 不返回所有结果

java - 在某些列表中编号,Java Streams foreach

linux - 用于发现 IP 地址是否属于 IP 范围的脚本

c++ - 寻找算法来确定一个点是否在圆弧的左侧/右侧