Безопасное преобразование (вектор shared_ptr в объекты) в (вектор shared_ptr в постоянные объекты) - PullRequest
7 голосов
/ 17 мая 2011
class A {};

typedef shared_ptr<const A*> AConstPtr;
typedef shared_ptr<A*> APtr;

vector<APtr> ptr;

const vector<AConstPtr>* foo()
{
    return &ptr;
}

Этот код не компилируется, потому что "не существует неявного преобразования из вектора < Aptr >* в константный вектор < AConstPtr > *" Есть ли способ сделать эту работу безсоздание нового вектора и без использования небезопасного приведения?

Причина, по которой мне это нужно, заключается в том, что у меня есть класс, который хранит список внутренне как вектор < APtr >, но должен выставитьполностью константная версия этого через его интерфейс.

1 Ответ

6 голосов
/ 17 мая 2011

Нет никакого способа сделать такое преобразование, поскольку разные shared_ptr s не являются связанными типами.

Во-первых, действительно ли вы уверены, что вам нужно раскрыть детали реализации, что есть внутренний вектор общего доступа?указатели?Это действительно связывает вас с этой реализацией, и она не подлежит изменению, не нарушая API.

А как насчет использования предложения @ Cubbi и использования вашего интерфейса в качестве интеграторов с методами begin и end??Тогда вы можете легко представить контейнер внешним клиентам, не привязываясь к vector.

...