如何判断迭代器是否为libc++中的wrap_iter类型?
如何判断迭代器是否为libc++的
wrap_iter类型 libc++内部有个未对外公开的类型 trait std::__is_wrap_iter,专门用来检测wrap_iter,但它属于实现细节,随时可能变更,不建议直接用在生产代码里。
自己实现is_wrap_iter_type的话,用模板特化最直接:
#include <__iterator/wrap_iter.h> // 默认判定为非wrap_iter类型 template <typename Iter> struct is_wrap_iter_type : std::false_type {}; // 对__wrap_iter<T>做特化处理 template <typename T> struct is_wrap_iter_type<std::__wrap_iter<T>> : std::true_type {}; // 辅助变量模板,简化使用 template <typename Iter> constexpr bool is_wrap_iter_type_v = is_wrap_iter_type<Iter>::value;
另外你示例里的enable_if写法存在语法错误,修正后的可用代码如下:
#include <type_traits> template<class T, class Iter, typename = std::enable_if_t<is_wrap_iter_type_v<Iter>>> void foo(T t, Iter i) { auto w = std::__unwrap_iter(i); // 处理w的逻辑 } template<class T, class Iter, typename = std::enable_if_t<!is_wrap_iter_type_v<Iter>>> void foo(T t, Iter i) { auto w = i; // 处理w的逻辑 }
如果不想依赖libc++的内部头文件,也可以通过检测迭代器是否能适配std::__unwrap_iter调用的方式间接判断,但这种方法准确性不如模板特化——毕竟可能存在其他类型也能匹配__unwrap_iter的重载。
内容的提问来源于stack exchange,提问作者A. K.
相关产品推荐
相关产品推荐

