Есть такой код:
class A {
public:
void process() {}
};
class B {
public:
B(const A* a)
: m_a(a)
{}
const A* getA() const {return m_a;}
private:
const A* m_a;
};
void f(const std::vector<A*>& aa, const B& b) {
// Известно, что указатель хранящийся в b так же содержиться и в aa.
// Нужно сделать так:
b.getA()->process(); // Ошибка! b.getA() возвращает const A*, а нужно A*
}
Подскажите пожалуйста какой лучший способ снять константность с указателя на A в функции f?
Можно сделать const_cast — но это запрещено в code style.
Снимать константность с B::m_a не хочется, так как это повлечёт за собой снятие константности в куче других мест, как в приведённом фрагменте, так и за его пределами в реальной программе из которой этот фрагмент выделен. Тем более, что сам класс B никак не меняет экземпляр на который указывает m_a.
На текущий момент, я додумался только до того, чтобы искать в aa такое же значение, что и в b и использовать его.
Может быть в данной ситуации есть какое-то более простое, быстрое и красивое решение? Если вы его знаете, подскажите пожалуйста!
Может быть нужно слегка поменять структуру этого фрагмента? Мне нужно, чтобы экземпляр класса B мог ссылаться на конкретный экземпляр класса A и вызывать его константные функции. При этом экземпляр класса A реально храниться где-то в другом месте. Как именно организован этот механизм(через указатели или итераторы или что-то ещё) не принципиально.