我正在实施一个简单的std::vector.有两个insert功能:
template <typename T, typename Allocator>
typename Vector<T, Allocator>::iterator
Vector<T, Allocator>::insert(const_iterator pos, size_type count, const T& value)
{
checkIterator(pos);
auto p = const_cast<iterator>(pos);
if (count == 0) {
return p;
}
for (size_type i = 0; i < count; ++i) {
p = insert(p, value);
}
return p;
}
template <typename T, typename Allocator>
template <typename InputIt>
typename Vector<T, Allocator>::iterator
Vector<T, Allocator>::insert(const_iterator pos, InputIt first, InputIt last)
{
checkIterator(pos);
auto p = const_cast<iterator>(pos);
if (first == …Run Code Online (Sandbox Code Playgroud) 这是一个询问如何区分填充和范围构造函数的问题.代码复制到这里:
template <typename T>
struct NaiveVector {
vector<T> v;
NaiveVector(size_t num, const T &val) : v(num, val) { // fill
cout << "(int num, const T &val)" << endl;
}
template <typename InputIterator>
NaiveVector(InputIterator first, InputIterator last) : v(first, last) { // range
cout << "(InputIterator first, InputIterator last)" << endl;
}
};
Run Code Online (Sandbox Code Playgroud)
上面的代码不起作用,如该问题中所述.解决方案是使用SFINAE来定义范围构造函数,如下例所示:
template
<
typename InputIterator
, typename = typename ::std::enable_if
<
::std::is_same
<
T &
, typename ::std::remove_const
<
decltype(*(::std::declval< InputIterator >()))
>::type
>::value …Run Code Online (Sandbox Code Playgroud)