C++ 轻便,支持宽松的循环范围

C++ 轻便,支持宽松的循环范围,c++,foreach,range,c++17,forward-compatibility,C++,Foreach,Range,C++17,Forward Compatibility,C++17可能会,允许end返回一个不同的类型,例如sentinel: struct MyRange { struct Sentinel {}; int* begin(); Sentinel end(); }; bool operator!=(int*, MyRange::Sentinel); 目前唯一支持此功能的编译器是gcc 6.1和clang 4.0+。如果我正在编写一个范围类型,其中sentinel对end类型更有效,那么如何检测编译器是否支持relaxedra

C++17可能会,允许end返回一个不同的类型,例如sentinel:

struct MyRange {
    struct Sentinel {};
    int* begin();
    Sentinel end();
};
bool operator!=(int*, MyRange::Sentinel);
目前唯一支持此功能的编译器是gcc 6.1和clang 4.0+。如果我正在编写一个范围类型,其中sentinel对end类型更有效,那么如何检测编译器是否支持relaxedrange?在上面链接的P0184R0中,我看不到对此的任何讨论;是否会提供功能测试宏

其他问题:

如果有办法检测编译器支持,库更改我的最终成员函数的返回类型是否安全?例如,我是否需要将sentinel隐式转换为迭代器类型? 相反,对于C++17之前的编译器,是否值得使用不同的名称(例如sentinel)公开我的sentinel?pre-C++17算法能否有效地使用[begin,sentinel]还是不值得额外的代码?
哨兵之所以高效,很少与哨兵的内部状态有关

因此,一种方法是为Sentinel提供足够的内部状态,以生成自身的迭代器版本

即使在C++14中,使用统一的end-begin for:循环和算法(坚持相同的开始/结束迭代器类型),手写算法或循环也可以使用sentinel并获得效率

如果您希望获得最大的覆盖率,像这样的库通常是您的最佳选择,但截至目前为止,我还没有找到一个C++17功能检测集

据我所知,没有办法检测接受不同开始/结束迭代器类型的for:循环的存在。我可以想象一些constexpr noexcept hacks,但这超出了我的能力


检测是否接受sentinel end迭代器可能可以用SFINAE完成。但我不确定C++17是否已经sentinel化,或者是否打算这样做;ranges-v3应该处理这方面的返工。

sentinel有效的原因很少与sentinel的内部状态有关

因此,一种方法是为Sentinel提供足够的内部状态,以生成自身的迭代器版本

即使在C++14中,使用统一的end-begin for:循环和算法(坚持相同的开始/结束迭代器类型),手写算法或循环也可以使用sentinel并获得效率

如果您希望获得最大的覆盖率,像这样的库通常是您的最佳选择,但截至目前为止,我还没有找到一个C++17功能检测集

据我所知,没有办法检测接受不同开始/结束迭代器类型的for:循环的存在。我可以想象一些constexpr noexcept hacks,但这超出了我的能力


检测是否接受sentinel end迭代器可能可以用SFINAE完成。但我不确定C++17是否已经sentinel化,或者是否打算这样做;ranges-v3应该处理该迭代器的返工。

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

根据,您可以检查是否基于‌​r大于或等于201603。当然,Visual Studio不支持任何功能测试宏,因此您必须单独检查其版本控制。VS2015更新3中提供了对它的支持,但除了大多数其他C++17支持外,您还必须使用/std:C++最新开关。

根据,您可以检查是否u-cpp\u-range\u-based\u用于is大于或等于201603。@cpp学习者啊,当然。请回答这个问题,我会接受。根据,您可以检查uuu cpp_range_based_for是否大于或等于201603。@cpp学习者啊,当然。请回答这个问题,我会接受。