У меня есть класс A
и член функции f
, которая возвращает указатель на некоторых содержимый экземплярПроектирование двух эквивалентных функций члена возвращающихся константные и неконстантный член указатель на, соответственно
int* A::f() {
// common code ...
return &(this->some_container[some_index])
}
Теперь мне нужно аналог функция, которая только возвращает указатель const
, т.е.
const int* A::f_const() const {
// exactly the same lengthy code ...
return &(this->some_container[some_index]);
}
Обратите внимание, что, как «длинный код» не изменяет экземпляр A
, это также делает функцию const
w.r.t. экземпляр (второй оператор const
).
Мой вопрос: Теперь мне интересно, если есть какое-то решение, чтобы избежать код двухкратного без использования третьей функции.
С одной стороны, вызывая f
внутри f_const
будет незаконным, поскольку f
не const
w.r.t. владеющий экземпляр. С другой стороны, при вызове f_const
внутри f
потребуется преобразовать указатель const
в указатель не , что также невозможно.
Есть ли какой-либо элегантный метод декларации, чтобы избежать удвоения кода?
Как уже говорилось, с помощью третьей функции с общей функциональностью f
и f_const
не вариант здесь, как и при применении для большого числа функций, это сделало бы код менее читаемым.
Возможный дубликат [Как удалить дублирование кода между аналогичными функциями const и non-const?] (Http://stackoverflow.com/questions/123758/how-do-i-remove-code-duplication-between -similar-const-and-non-const-member-func) – Rakete1111
Почему вы это делаете? Человек никогда не перестает удивляться беспредельно инертным проблемам С ++, с которыми сталкивается. Доктор Страуструп никогда не предназначался для своей «практической шутки» «языка» (просто спросите его), чтобы послужить основой для объяснения философских аргументов о том, какие побочные эффекты от того, какие механизмы могут привести к такому-то неожиданному или незавершенному семантика. Конечно, вы могли бы просто скопировать датум в статический скаляр и вернуть его адрес, который должен оставаться довольно постоянным :-) –