Basit bir std::vector
uygularım.Derleyici, "vector :: insert" in iki varyasyonu arasında nasıl ayrım yapar?
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);
}
Ama önce insert
fonksiyonunu kullanmak istediğinizde, derleyici ikincisi çağırır: İki insert
fonksiyonlardır
Vector<int> vi = {1, 2, 3};
vi.insert(vi.begin(), 3, 4); // get compile error, using insert(const_iterator pos, InputIt first, InputIt last).
doğru yapmak için?
'std :: vektör'ünün belirtimi, bu durumda" derleyici sihirbazına "dayanır:" Çıktı türü "ifadesi," InputIterator "gereklilikleriyle uyumlu olmadığı sürece seçilmez. Kavramlar yaşadığında, bunu kendi kodunuzda kolayca ifade edebileceğinizi düşünüyorum. O zaman tam olarak ne yapabileceğinizden emin değilim. –
@ M.M Neden düzenli kullanıcı meta programlaması + sfinae yerine derleyici sihirbazını kullanıyor? –
Bağımsız değişkenlerden birini değiştirerek, örneğin, "boyut_türü" için bir "U" sözcüğünü ekleyerek veya bir cast eklemeyi açıkça ekleyerek farklı bir tür değiştirin. – o11c