事情的起因是我在尝试实现std::list
的过程中,我发现了其insert
函数并不如我想象中的顺序工作。
伪代码如下
//construct 1
iterator insert( const_iterator pos, size_type n, const value_type &value )
//construct 2
template<typename InputIterator>
iterator insert( const_iterator pos, InputIterator first, InputIterator last )
//test
insert(pos,1,2);
insert(pos,1.5,2);
第一句会调用第二个构造函数,而第二句话会调用第一个构造函数。 Google了一下,意外发现zhihu上有类似的讨论
C++ 重载匹配的一个问题? - 知乎 https://www.zhihu.com/question/31491227
其问题出在,insert(pos,1,2)
在第二个构造函数中,可以被构造成两个int,更加符合条件。为了避免这个问题,可以引入std::enable_if
(注:C++17新标准中对enable_if的嵌套又进行了改进)和std::is_convitable来实现。
引入isInputIterator
函数,再在构造函数中加入判断项
template <typename Iter>
using isInputIterator = typename std::enable_if<
std::is_convertible<typename std::iterator_traits<Iter>::iterator_category,
std::input_iterator_tag
>::value
>::type;
//加入判断
template<typename InputIterator,typename = isInputIterator(InputIterator)>
iterator insert( const_iterator pos, InputIterator first, InputIterator last )