Я конвертирую большой код для использования пользовательских общих указателей вместо необработанных указателей. У меня проблема с разрешением перегрузки. Рассмотрим следующий пример:Разрешение перегрузки и общие указатели на const
#include <iostream>
struct A {};
struct B : public A {};
void f(const A*)
{
std::cout << "const version\n";
}
void f(A*)
{
std::cout << "non-const version\n";
}
int main(int, char**)
{
B* b;
f(b);
}
Этот код правильно пишет «неконстантную версию», потому что qualification conversions играют роль в ранжировании последовательностей неявным. Теперь посмотрим на версию с помощью shared_ptr:
#include <iostream>
#include<memory>
struct A {};
struct B : public A {};
void f(std::shared_ptr<const A>)
{
std::cout << "const version\n";
}
void f(std::shared_ptr<A>)
{
std::cout << "non-const version\n";
}
int main(int, char**)
{
std::shared_ptr<B> b;
f(b);
}
Этот код не компилируется, потому что вызов функции неоднозначно.
Я понимаю, что user-defined deduction-guide будет решением, но он все еще не существует в Visual Studio.
Я преобразовываю код, используя регулярное выражение, потому что тысячи таких вызовов. Регулярные выражения не могут отличить вызовы, которые соответствуют версии const, от тех, которые соответствуют неконстантной версии. Возможно ли более тонкое управление разрешением перегрузки при использовании общих указателей и избежать необходимости менять каждый вызов вручную? Конечно, я мог бы (get) указать (raw) указатель и использовать его в вызове, но я хочу полностью удалить исходные указатели.
@ πάνταῥεῖ Это бесплатная функция перегрузки, не задействована какая-либо функция-член. –
«Конечно, я мог бы .get() использовать необработанный указатель и использовать его в вызове, но я хочу полностью удалить исходные указатели». Выделение исходных указателей не обязательно является лучшим способом. Во многих случаях необработанный указатель будет намного более результативным, чем 'shared_ptr', поскольку контейнер уменьшает доступность места в памяти к этому экземпляру. Если у вас есть время, я бы посоветовал вам ознакомиться с параметром «Параметры смарт-указателя травы Трава Саттера» (https://herbsutter.com/2013/06/05/gotw-91-solution-smart-pointer-parameters/). – cyberbisson
@cyberbisson Вы, конечно, правы, но мне нужны общие указатели, чтобы спасти код из состояния хаоса, который был вызван многими людьми, проходящими много объектов вокруг, используя необработанные указатели, и я готов заплатить небольшую цену за какой-то заказ. Спасибо за ссылку, я передаю общие указатели по постоянной ссылке, когда это возможно. –