2016-08-16 1 views
-1

У меня есть класс 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 не вариант здесь, как и при применении для большого числа функций, это сделало бы код менее читаемым.

+1

Возможный дубликат [Как удалить дублирование кода между аналогичными функциями const и non-const?] (Http://stackoverflow.com/questions/123758/how-do-i-remove-code-duplication-between -similar-const-and-non-const-member-func) – Rakete1111

+0

Почему вы это делаете? Человек никогда не перестает удивляться беспредельно инертным проблемам С ++, с которыми сталкивается. Доктор Страуструп никогда не предназначался для своей «практической шутки» «языка» (просто спросите его), чтобы послужить основой для объяснения философских аргументов о том, какие побочные эффекты от того, какие механизмы могут привести к такому-то неожиданному или незавершенному семантика. Конечно, вы могли бы просто скопировать датум в статический скаляр и вернуть его адрес, который должен оставаться довольно постоянным :-) –

ответ

0

Я хочу предпочесть ответ, который может зависеть от конкретного контекста (например, длина кода функций, возвращаемого типа и т. Д.).

В целом, для моих опытов, наиболее практичным, даже, может быть, немного уродливым, является решение const cast operator.

Просто реализовать Const метод и получить его с преобразованием в неконстантного другим способом. Что-то вроде:

const int* A::f_const() const { 
    return &(this->some_container[some_index]); 
} 

int* A::f() { 
    return const_cast<int*>(f_const()); 
} 

Это, как правило, безопасно, потому что вы являетесь разработчиком самого класса.

+0

Спасибо за ваш конструктивный ответ.Кажется, что реализация 'f_const' пропускает участника. Должно ли это просто быть 'this-> f_const()' или нужно ли это '' 'так или иначе? – flonk

+0

@flonk Извините, я не понимаю, что вы имеете в виду. Можете ли вы попытаться объяснить это снова и еще? –

+0

Извините, я не смог выразить что-то, что не имеет никакого смысла, ваш ответ совершенно прекрасен :) – flonk

Смежные вопросы