6 / 5 / 1
Регистрация: 05.10.2020
Сообщений: 122
|
||||||
1 | ||||||
Как избежать дублирования кода при написании константного и не константного метода?28.02.2022, 15:43. Показов 2433. Ответов 36
Есть класс Buffer, который содержит метод forBounds, который в качестве параметров принимает вспомогательный класс Bounds и шаблонный элемент _Func, который должен быть лямбда-функцией, в которой описывается логика. В общем, сам метод чем-то напоминаем функцию std::for_each. Проблема заключается в том, что мне нужно как-то сделать два метода const и не const версию. Дублировать код и писать макросы как-то не хочется.
Есть ли способ, как можно сделать два одинаковых по коду метода, но так, чтобы один был const, а другой нет, но при этом избежать дублирования?
0
|
28.02.2022, 15:43 | |
Ответы с готовыми решениями:
36
Возврат константного значение из функции/метода Выполнение метода в зависимости от константного свойства Как избежать дублирования кода при использовании virtual функций? Избежать дублирования проверок при выполнении метода |
8972 / 4318 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
||||||
01.03.2022, 01:21 | 21 | |||||
ты ошибаешься.
this не может быть const t ,поскольку ключевое слово обозначает prvalue ,для которого отбрасывается верхний const .пример: https://rextester.com/IRRMSL71179
что бы ты привел минимальный пример-иллюстрацию того, чего ты хочешь. и когда я пишу: "минимальный пример-иллюстрацию", то имею ввиду полноценную программу, которая включает в себя функцию main, и все необходимые детали, а не огрызки. UB
0
|
фрилансер
5859 / 5398 / 1104
Регистрация: 11.10.2019
Сообщений: 14,412
|
|
01.03.2022, 06:30 | 22 |
Аким2020, захват в лямбде ссылки или указателя на буфер сильно всё упростит, в том числе и отладку.
0
|
6 / 5 / 1
Регистрация: 05.10.2020
Сообщений: 122
|
||||||
01.03.2022, 10:23 [ТС] | 23 | |||||
hoggy,
0
|
SmallEvil
|
01.03.2022, 10:37
#24
|
Не по теме: Аким2020, почему то мне кажется, что вы воюете с ветряными мельницами...
0
|
6 / 5 / 1
Регистрация: 05.10.2020
Сообщений: 122
|
|
01.03.2022, 10:41 [ТС] | 25 |
SmallEvil, возможно...
0
|
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
|
||||||
01.03.2022, 11:17 | 26 | |||||
Или то же самое через концепты в C++20.
0
|
6 / 5 / 1
Регистрация: 05.10.2020
Сообщений: 122
|
||||||
01.03.2022, 11:50 [ТС] | 27 | |||||
DrOffset, но мне же все равно тут придется писать два одинаковых определения метода forEach. Для const и non-const.
0
|
3719 / 2648 / 761
Регистрация: 29.06.2020
Сообщений: 9,800
|
|
01.03.2022, 11:59 | 28 |
Да, это первое что приходит в голову, но проблему изначального вопроса не решает.
Вся суть константности, инкапсуляции не в том что бы зделать код "деревянным" или "железобетонным", но как раз наоборот. Аким2020, в Вашем случае, нет в необходимости в константном методе вообще. Поэтому я долго не мог понять сути вопроса, проблемы. Если ваш метод, изменяет данные, то он не может быть в априори константным. При попытке вызова такой функции от константного объекта, получите compile time error. В чем вопрос ? Добавлено через 3 минуты Или если метод не изменяет данные, то делайте его ТОЛЬКО константным.
0
|
6 / 5 / 1
Регистрация: 05.10.2020
Сообщений: 122
|
|||||||||||
01.03.2022, 12:19 [ТС] | 29 | ||||||||||
SmallEvil, const метод нужен для обхода коллекции без изменения самой коллекции. Сейчас попробую объяснить еще раз более подробно.
Вот то, как это работает с дублированием кода. То, как я хотел бы, чтоб это работало.
А теперь я пробую убрать дублирование кода, вызовом const метода из non-const, как мне предлагали ранее.
0
|
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
|
||||||
01.03.2022, 12:21 | 30 | |||||
Аким2020,
0
|
6 / 5 / 1
Регистрация: 05.10.2020
Сообщений: 122
|
|
01.03.2022, 12:35 [ТС] | 31 |
SmallEvil,
в этом-то и проблема. Я пытаюсь сделать один метод, который бы можно было использоваться для обхода без изменений, а другой, который бы точно также обходил коллекцию, но с возможностью изменения.
Возможно, для метода, который обходит каждый элемент коллекции - это выглядит глупо, но в моем класс Buffer, который в заглавии этой темы, метод forBounds прячет в себе некую логику. Добавлено через 10 минут DrOffset, вот это, вроде, работает, как надо. Сейчас разберусь до конца и скажу точно.
0
|
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
|
||||||
01.03.2022, 12:59 | 32 | |||||
Это ничем не отличается от того, что было до этого, за исключением раскрытия тел методов.
Конкретно этот прием с кастом можно рассмотреть в книге Мейерса (точно не помню в какой, кажется в Эффективное использование C++ - 55 советов). Это не очень распространенный прием и довольно спорный, и в некоторых случаях его использование небезопасно, но если вы приняли меры предосторожности, то вполне допустимый. Можно и без кастов обойтись, если сделать шаблонную функцию, или воспользоваться стандартной:
Добавлено через 10 минут
0
|
6 / 5 / 1
Регистрация: 05.10.2020
Сообщений: 122
|
|
01.03.2022, 13:23 [ТС] | 33 |
DrOffset, возвращаемый тип auto. Не подскажите, как можно указать, например, bool?
0
|
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
|
||||||
01.03.2022, 13:27 | 34 | |||||
Сообщение было отмечено Аким2020 как решение
Решение
Возвращаемый тип void, если что
1
|
6 / 5 / 1
Регистрация: 05.10.2020
Сообщений: 122
|
|
01.03.2022, 13:43 [ТС] | 35 |
DrOffset, ну, вы гений получается.
Все работает даже лучше, чем я себе представлял. Спасибо вам огромное, а-то я уже с макросом думал смириться(
0
|
3719 / 2648 / 761
Регистрация: 29.06.2020
Сообщений: 9,800
|
||||||
01.03.2022, 13:49 | 36 | |||||
Сообщение было отмечено Аким2020 как решение
Решение
Не оно ?
1
|
6 / 5 / 1
Регистрация: 05.10.2020
Сообщений: 122
|
|
01.03.2022, 15:03 [ТС] | 37 |
SmallEvil, да, это тоже отлично подходит и синтаксис более дружелюбный.
0
|
01.03.2022, 15:03 | |
01.03.2022, 15:03 | |
Помогаю со студенческими работами здесь
37
Как избежать дублирования кода? Как избежать дублирования кода в Си Как избежать дублирования кода? Наследование Ошибка при выводе константного значения С++ Ошибка при обращении к методу константного объекта Усечение константного значения при присвоении значений объектам структуры Избежать дублирования кода Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи | |||||
Как работать с ветками (branch) в Git
InfoMaster 17.01.2025
Система контроля версий Git произвела революцию в процессе разработки программного обеспечения, предоставив разработчикам мощный инструмент для управления изменениями в коде. Одной из наиболее важных. . .
|
Как откатить последние коммиты в Git
InfoMaster 17.01.2025
Система контроля версий Git стала неотъемлемой частью современной разработки программного обеспечения, предоставляя разработчикам мощные инструменты для управления изменениями в коде. Одним из. . .
|
Что такое boilerplate и scaffold, чем они отличаются
InfoMaster 17.01.2025
В современном мире разработки программного обеспечения эффективность и скорость создания качественного кода играют crucial роль в успехе проектов. Разработчики постоянно ищут способы оптимизировать. . .
|
Чем отличаются ссылки и указатели в С++
InfoMaster 17.01.2025
В современном программировании на C++ эффективная работа с памятью является ключевым аспектом разработки качественного программного обеспечения. Указатели и ссылки представляют собой два. . .
|
В чем разница между PUT и POST
InfoMaster 17.01.2025
В современной веб-разработке правильное использование HTTP-методов играет ключевую роль в создании надежных и эффективных API-интерфейсов. Протокол HTTP прошел долгий путь развития с момента своего. . .
|
DTO, POCO и Value Object: что это такое, когда и как использовать
InfoMaster 17.01.2025
Введение в паттерны передачи данных
В современной разработке программного обеспечения эффективное управление данными и их передача между различными слоями приложения являются ключевыми аспектами. . .
|
Что такое pull request в Git
InfoMaster 17.01.2025
В современной разработке программного обеспечения pull request в Git представляет собой ключевой механизм для эффективного взаимодействия между разработчиками при работе над общим кодом проекта. По. . .
|
Как вернуться к предыдущему коммиту в Git
InfoMaster 17.01.2025
Система контроля версий Git представляет собой мощный инструмент для управления изменениями в программном коде, который позволяет разработчикам эффективно отслеживать и контролировать историю. . .
|
Что такое паттерны программирования и проектирования
InfoMaster 17.01.2025
Роль паттернов в современной разработке программного обеспечения
В современном мире разработки программного обеспечения паттерны проектирования стали неотъемлемой частью профессионального подхода. . .
|
Как добавить конструктор Яндекс Карт на сайт
InfoMaster 17.01.2025
Введение в API Яндекс Карт
В современной веб-разработке интеграция картографических сервисов стала неотъемлемой частью многих проектов. API Яндекс Карт представляет собой мощный инструмент для. . .
|
Что такое javascript:void(0) и зачем это нужно
InfoMaster 17.01.2025
Когда вы сталкиваетесь с веб-разработкой, особенно с использованием JavaScript, одной из директив, которая часто встречается, является javascript:void(0). Это выражение вызывает интерес из-за своей. . .
|
Что такое оркестрация и хореография микросервисов
InfoMaster 17.01.2025
Введение в оркестрацию и хореографию микросервисов
В современном мире разработки программного обеспечения микросервисная архитектура стала ключевым подходом к созданию масштабируемых и гибких. . .
|