迭代器类型的重载决策:更简单的方法?

时间:2015-04-20 20:04:48

标签: c++

我正在尝试仅使用C ++ 03技术重新实现std::vector类(出于教育目的),并且遇到了std::vector::assign方法的问题,以两种形式声明:< / p>

void assign(size_type count, const_reference value);

template<class In>
void assign(In first, In last);

在实例化时,编译器似乎更喜欢第二种形式,导致形式错误:

In instantiation of 'void dojo::vector<T>::assign(In, In) [with In = int; T = int]':
error: invalid type argument of unary '*' (have 'int')
    push_back(*first++);

我认为我需要给编译器一个提示,即In模板类型只应绑定到迭代器类型,这样只有在使用迭代器调用时,才会在重载解析期间选择方法的第二种形式。但是,提供这样的提示似乎有些复杂。 GNU的libstdc ++使用了一个名为__is_integer的东西:

510         template<typename _InputIterator>
511         void
512         assign(_InputIterator __first, _InputIterator __last)
513         {
514           // Check whether it's an integral type.  If so, it's not an iterator.
515           typedef typename std::__is_integer<_InputIterator>::__type _Integral;
516           _M_assign_dispatch(__first, __last, _Integral());
517         }

和llvm的libc ++使用enable_if,它看起来更复杂,只有在C ++ 11之后才可用:

1363    template <class _Tp, class _Allocator>
1364    template <class _InputIterator>
1365    typename enable_if
1366    <
1367         __is_input_iterator  <_InputIterator>::value &&
1368        !__is_forward_iterator<_InputIterator>::value &&
1369        is_constructible<
1370           _Tp,
1371           typename iterator_traits<_InputIterator>::reference>::value,
1372        void
1373    >::type
1374    vector<_Tp, _Allocator>::assign(_InputIterator __first, _InputIterator __last)
1375    {
1376        clear();
1377        for (; __first != __last; ++__first)
1378            push_back(*__first);
1379    }

是否有更简单的方法与C ++ 03兼容?

0 个答案:

没有答案