Как создать неконстантный метод из константного метода? - PullRequest
9 голосов
/ 26 августа 2009

Стремясь к правильности, я часто пишу такой код, как этот

class Bar;

class Foo {
public:
  const Bar* bar() const { /* code that gets a Bar somewhere */ }

  Bar* bar() {
    return const_cast< Bar* >(
      static_cast< const Foo* >(this)->bar());
  }
};

для многих методов, таких как bar(). Написание этих неконстантных методов, которые вызывают константные методы вручную, утомительно; кроме того, я чувствую, что повторяюсь - что мне плохо.

Что я могу сделать, чтобы облегчить эту задачу? (Макросы и генераторы кода не допускаются.)

Редактировать: Помимо решения Литба мне также нравится мое собственное. :)

Ответы [ 11 ]

0 голосов
/ 26 августа 2009

Ваш код подразумевает, что const bar () фактически создает и возвращает новый Bar, и я нахожу это странным, если вы делаете это много.

Для меня большая проблема в том, что константность в функции-члене ограничена ссылочными и не указательными членами. В тот момент, когда у вас есть (неконстантные) члены-указатели, const-функция может изменять их, даже если она претендует на константность в поле.

Если ваш экземпляр Bar является переменной-членом, рассмотрите возможность возврата ссылки.

...