我正在實施一個簡單的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