我正在实施一个简单的std::vector
。有两种insert
功能:编译器如何区分“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 == last) {
return p;
}
for (auto iter = first; iter != last; ++iter) {
p = insert(p, *iter);
++p;
}
return p - (last-first);
}
但是,当我想用第一insert
函数,编译器将调用第二个:
Vector<int> vi = {1, 2, 3};
vi.insert(vi.begin(), 3, 4); // get compile error, using insert(const_iterator pos, InputIt first, InputIt last).
为什么编译器选择第二个功能,以及如何修改我的代码做对吧?
对于这种情况,'std :: vector'的规范依赖于“编译器魔术”:它说迭代器版本没有被选择,除非推导的类型符合'InputIterator'的要求。我猜当Concepts开始运行时,您可以在自己的代码中轻松表达;我不确定你在 –
@ M.M之前可以做什么。为什么它使用编译器魔术而不是普通用户元编程+ sfinae? –
更改其中一个参数,使其成为不同的类型...例如,通过将“U”附加到“size_type”的文字上,或者通过明确添加演员表。 – o11c