我正在尝试仅使用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兼容?