Как обойтись без const_cast?
От: Андрей Е  
Дата: 14.05.12 07:55
Оценка:
Есть такой код:
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 реально храниться где-то в другом месте. Как именно организован этот механизм(через указатели или итераторы или что-то ещё) не принципиально.
const_cast
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.