Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
0 / 0 / 2
Регистрация: 19.06.2017
Сообщений: 28

Реализация схожих функций без копипаста

19.06.2017, 14:05. Показов 2029. Ответов 39
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Приветствую.
Задача: имеется несколько схожих функций (одинаковые параметры, код отличается минимально - в одном месте)
Функции довольно большие, разбить на части не вариант - циклы и прочее.
Как в с++ реализовать это правильно, без стен бойлерплейта?
Все что придумал - завернуть в дефайн, но это как-то немножко слишком.
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
19.06.2017, 14:05
Ответы с готовыми решениями:

Написание своих функций chr() и ord(), без использования встроенных функций
В общем, нужно написать эти две функции, которые будут являться аналогами встроенных. ex_chr(code : byte) : char; begin .... ...

Перегрузка функций. Реализация функций
Разработать функцию f(x) , которая возвращает младшую цифру натурального числа x . Вычислить с ее помощью значение выражения z= f(a) +...

Реализация функций
Подскажите пожалуйста как это расписать в C#

39
Software Developer
 Аватар для fastb1t
315 / 229 / 113
Регистрация: 03.05.2017
Сообщений: 1,336
19.06.2017, 14:26
Цитата Сообщение от nonenever Посмотреть сообщение
(одинаковые параметры, код отличается минимально - в одном месте)
Ну то сделайте ещё один параметр, а в функции проверку этого параметра. И когда вызываете функцию задавать нужный параметр.
0
0 / 0 / 2
Регистрация: 19.06.2017
Сообщений: 28
19.06.2017, 14:33  [ТС]
Цитата Сообщение от decrement Посмотреть сообщение
в функции проверку этого параметра
Формально работать будет, но это плохая идея - лишние бранчи стоят дорого.
Все-таки в с++ хотелось бы получить соответствующую производительность - поэтому необходимо решение compile-time.
Для чистой с - очевидный дефайн, а в с++11 эта проблема вообще решена?
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
19.06.2017, 14:38
Цитата Сообщение от nonenever Посмотреть сообщение
эта проблема вообще решена?
Какая? Мы тут пока что не видим конкретных примеров и обсуждаем коня в вакууме.
0
0 / 0 / 2
Регистрация: 19.06.2017
Сообщений: 28
19.06.2017, 14:47  [ТС]
Цитата Сообщение от MrGluck Посмотреть сообщение
Какая?
Понимаю. Хорошо, вот пример (сокращенный, разумеется):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void func0(Iter * I, int parm)
{
    I->Reset();
    while (I->Next())
    {
        //тут много совпадающего кода
       I->Func0(parm);
    }
}
void func1(Iter * I, int parm)
{
    I->Reset();
    while (I->Next())
    {
        //тут много совпадающего кода
        I->Func1(parm);
    }
}
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
19.06.2017, 14:52
nonenever, очевидно же, передавать в качестве параметра ссылку на функцию-член, принимающую int и возвращающую void.
Вам нужен пример?
0
0 / 0 / 2
Регистрация: 19.06.2017
Сообщений: 28
19.06.2017, 15:06  [ТС]
Цитата Сообщение от MrGluck Посмотреть сообщение
передавать в качестве параметра ссылку на функцию
Благодарю, это вариант.
Но к сожалению (моя вина - пример не очень) расхождения есть не только такие - вызов может вовсе отсутствовать, или присутствовать комбинации всякие.
C++
1
2
3
4
5
6
7
8
void func2(Iter * I)
{
    I->Reset();
    while (I->Next())
    {
        //тут много совпадающего кода
    }
}
Есть более общее решение? Что-то вроде темплейтов функций, или что-то еще из нового в 11.
Сам я в с++11 не очень - даже не представляю куда гуглить.
0
93 / 69 / 22
Регистрация: 17.10.2011
Сообщений: 235
19.06.2017, 15:06
Лучший ответ Сообщение было отмечено nonenever как решение

Решение

Цитата Сообщение от nonenever Посмотреть сообщение
Понимаю. Хорошо, вот пример (сокращенный, разумеется):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void func0(Iter * I, int parm)
{
    I->Reset();
    while (I->Next())
    {
        //тут много совпадающего кода
       I->Func0(parm);
    }
}
void func1(Iter * I, int parm)
{
    I->Reset();
    while (I->Next())
    {
        //тут много совпадающего кода
        I->Func1(parm);
    }
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
template <std::size_t N>
void Func(int parm)
    if constexpr (I == 0) {
        Func0(parm);
    } else {
        Func1(parm);
    }
}
...
template <std::size_t N>
void func(Iter * I, int parm){
    I->Reset();
    while (I->Next())
    {
        //тут много совпадающего кода
        I->Func<N>(parm);
    }
}
нужная функция подставляется во время компиляции
вызов:
C++
1
2
func<0>(it,parm);
func<1>(it,parm);
1
0 / 0 / 2
Регистрация: 19.06.2017
Сообщений: 28
19.06.2017, 15:09  [ТС]
Цитата Сообщение от vndtta Посмотреть сообщение
if constexpr (I == 0) {
О, это похоже и правда оно самое!
Пошел проверять.
Благодарности и всякое такое.
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
19.06.2017, 15:10
Цитата Сообщение от nonenever Посмотреть сообщение
О, это похоже и правда оно самое!
Убедитесь только, что ваш компилятор поддерживает С++17
0
Заблокирован
19.06.2017, 15:11
nonenever, Вы об шаблонах слышали? используйте их
0
0 / 0 / 2
Регистрация: 19.06.2017
Сообщений: 28
19.06.2017, 15:14  [ТС]
Цитата Сообщение от MrGluck Посмотреть сообщение
С++17
Хм, вроде на ISO C++11 constexpr работало.
Dev-C++ с MinGW.

Добавлено через 53 секунды
Цитата Сообщение от oksanavol Посмотреть сообщение
Вы об шаблонах слышали?
Нет, а что это такое?
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
19.06.2017, 15:23
Цитата Сообщение от nonenever Посмотреть сообщение
Хм, вроде на ISO C++11 constexpr работало.
constexpr if ввели в С++17
0
Заблокирован
19.06.2017, 15:26
nonenever, Вам уже написали пример как их использовать:
C++
1
template <std::size_t N>
0
93 / 69 / 22
Регистрация: 17.10.2011
Сообщений: 235
19.06.2017, 15:27
gcc 7.1, говорят, поддерживает
0
0 / 0 / 2
Регистрация: 19.06.2017
Сообщений: 28
19.06.2017, 15:32  [ТС]
Цитата Сообщение от MrGluck Посмотреть сообщение
в С++17
Уже убедился - не работает, разумеется.
Тогда еще вопрос: теоретически и без constexpr результат должен быть тот же:
C++
1
2
3
4
5
6
7
8
template <int N>
void Func(int parm)
    if (N == 0) {
        Func0(parm);
    } else {
        Func1(parm);
    }
}
По идее при компиляции должна остаться только одна ветка - а вторая выбрасывается.
Это есть в стандарте или хотя бы в описании компилятора (GCC желательно) или надо самому лезть в дизасм?
0
93 / 69 / 22
Регистрация: 17.10.2011
Сообщений: 235
19.06.2017, 15:36
тут, на наглийском правда http://en.cppreference.com/w/cpp/language/if
0
0 / 0 / 2
Регистрация: 19.06.2017
Сообщений: 28
19.06.2017, 15:37  [ТС]
Цитата Сообщение от vndtta Посмотреть сообщение
gcc 7.1
https://www.infoq.com/news/2017/05/gcc-71-released
Вроде бы да - это есть хорошо.
Теперь бы под винду это бы завести.
0
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
19.06.2017, 15:40
nonenever, теоретически - да, т.к. параметры шаблона подставляются перед компиляцией, а потому компилятор увидит нечто типа
C++
1
if(1 == 0)
и естественно это дело отбросит.
0
93 / 69 / 22
Регистрация: 17.10.2011
Сообщений: 235
19.06.2017, 15:45
вообще contsexpr можно указать при объявлении функции, так мы типа сообщаем компилятору, что значение можно вычислить во время копиляции, должно работать с с++11
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
19.06.2017, 15:45
Помогаю со студенческими работами здесь

Реализация функций
Здравствуйте, помогите пожалуйста дописать программу, нужно чтобы на кнопки можно было расшифровать и зашифровать, было 4 поля:1- ввод...

Реализация функций
Помогите, пожалуйста, реализовать методы классов (заголовки даны в biTree.g) Я плохо шарю, а завтра сдавать! Очень надо( Дан: biTree.h...

Влияние копипаста на Seo для тегов сайта
Здравствуйте,решил заняться SEO продвижением тегов:) я понимаю что не по теме,так как тут PHP тема обсуждается,а не SEO :sorry: Такой...

Реализация функций в БД магазина
Здравствуйте. Сделал БД магазина бытовой техники. Не могу реализовать и не знаю как: При продаже изделий каждый факт продажи...

Реализация встроенных функций
Кто может в виде паскаль кода расписать реалзацию такихвстроенных функций (корень, синус, косинус, арктангенс, натуральный логарифм)?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка. Рецензия / Мнение Это мой обзор планшета X220 с точки зрения школьника. Недавно я решила попытаться уменьшить свой. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru