C++98如何实现仅接受非整数类型、自定义或双向迭代器的函数模板
实现方案(C++98标准)
核心逻辑说明
你最初想排除整数类型的需求本质是为了避免模板和整数入参的重载(比如foo(size_t count, const value_type& val)这类重载)产生冲突,同时要满足入参仅接受「自定义迭代器」或「标准双向迭代器」。仅靠非整数判断不够严谨,最好同时增加迭代器合法性校验。
因为C++98没有内置的<type_traits>工具,你需要先自行实现几个基础的类型判断模板:
步骤1:实现基础类型判断辅助模板
// 1. 判断是否为整数类型 template <typename T> struct is_integral { static const bool value = false; }; // 特化所有整数类型 template <> struct is_integral<char> { static const bool value = true; }; template <> struct is_integral<signed char> { static const bool value = true; }; template <> struct is_integral<unsigned char> { static const bool value = true; }; template <> struct is_integral<short> { static const bool value = true; }; template <> struct is_integral<unsigned short> { static const bool value = true; }; template <> struct is_integral<int> { static const bool value = true; }; template <> struct is_integral<unsigned int> { static const bool value = true; }; template <> struct is_integral<long> { static const bool value = true; }; template <> struct is_integral<unsigned long> { static const bool value = true; }; // 2. 判断是否为双向迭代器 template <typename Iter> struct is_bidirectional_iterator { private: typedef char yes; typedef struct { char a[2]; } no; static yes test(std::bidirectional_iterator_tag); static no test(...); public: static const bool value = sizeof(test(typename std::iterator_traits<Iter>::iterator_category())) == sizeof(yes); };
步骤2:修改函数模板的enable_if条件
将三个判断条件组合(满足任意一个迭代器要求 + 不是整数类型):
template <typename InputIterator> foo (InputIterator first, InputIterator last, const allocator_type& alloc = allocator_type(), typename ft::enable_if< // 条件:不是整数类型,且(是自定义迭代器 或 是标准双向迭代器) !is_integral<InputIterator>::value && (InputIterator::InputIter || is_bidirectional_iterator<InputIterator>::value), InputIterator >::type* = 0) { insert(begin(), first, last); }
- 注意C++98不支持给非类型模板参数传NULL作为默认值,改为传空指针
0给指针类型的参数更稳妥
可参考的实现
- SGI STL 容器的
insert、区间构造函数实现,其中的__is_integer判断逻辑就是用来解决整数重载和迭代器模板的冲突问题 - 标准库
std::iterator_traits的迭代器类别萃取规则
内容的提问来源于stack exchange,提问作者how to change
相关产品推荐
相关产品推荐

