C++模板函数的重载决议问题

事情的起因是我在尝试实现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 ) 

标签: cpp, template

添加新评论