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

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

19.06.2017, 14:05. Показов 2034. Ответов 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
0 / 0 / 2
Регистрация: 19.06.2017
Сообщений: 28
19.06.2017, 15:48  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от TRam_ Посмотреть сообщение
теоретически - да
Мои слова, да.
Но внушает опасение существование if constexpr - если все так радужно, то зачем вообще оно нужно?
То есть понятно что с constexpr лишние ветки даже компилироваться не будут - а без constexpr будут скомпилированы, и (возможно) вырезаны оптимизатором.
Если это вся разница - то такой вариант подходит.

Добавлено через 39 секунд
Цитата Сообщение от vndtta Посмотреть сообщение
при объявлении функции
Это константные функции, это не то.
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
19.06.2017, 15:59
nonenever, возможно пойдет и что-то вроде этого:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
class Iter
{
public:
    void Func0(int parm)
    {    }
    void Func1(int parm)
    {     }    
   
    bool Next() {  /*....*/  }
    void Reset()  {   /*....*/  }
};
/*******************************************************/
 
template <void (Iter::* Func)(int)>
void func(Iter * I, int parm)
{
    I->Reset();
    while (I->Next())
    {
        //тут много совпадающего кода
       (I->*Func)(parm);
    }
}
 
void func0(Iter * I, int parm)
{
    func<&Iter::Func0>(I, parm);
}
void func1(Iter * I, int parm)
{
    func<&Iter::Func1>(I, parm);
}
Или без шаблонов вовсе, просто передавать указатель на функцию третьим параметром.

Добавлено через 2 минуты
Цитата Сообщение от nonenever Посмотреть сообщение
Но внушает опасение существование if constexpr - если все так радужно, то зачем вообще оно нужно?
Раньше это зависело от реализации компилятора, теперь это есть в стандарте, следовательно можно получить некоторые гарантии.
0
93 / 69 / 22
Регистрация: 17.10.2011
Сообщений: 235
19.06.2017, 16:00
там можно сделать так
C++
1
2
3
4
5
6
7
8
9
template<size_t N>
auto func(){
    if constexpr (N==0){
         return 10;
    }
    else{
        return string("ten");
    }
}
0
0 / 0 / 2
Регистрация: 19.06.2017
Сообщений: 28
19.06.2017, 16:04  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
template <void (Iter::* Func)(int)>
Это хорошо, да - лучше чем передавать параметрами.
Если будут варианты отличающиеся только вызываемой функцией - так и сделаю.
Для варианта где вызова может не быть вовсе - не подходит, там придется лепить шаблоны с ифами, хотя бы без constexpr - если с++17 не получится.
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
19.06.2017, 16:18
Цитата Сообщение от nonenever Посмотреть сообщение
Для варианта где вызова может не быть вовсе - не подходит, там придется лепить шаблоны с ифами, хотя бы без constexpr - если с++17 не получится.
Всегда можно сделать вызов, если его нет и вынести разный код в функции. Какая разница, передаешь ты число, как в вариантах на первой странице, или псевдоадрес функции? Тот же constexpr if получается, только совместимый со старыми версиями языка. Более того, именно так раньше и эмулировали consexpr if:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
/*******************************************************/
template <bool Cond, typename T, typename E>
struct static_if : T
{ };
template <typename T, typename E>
struct static_if<false, T, E> : E
{ };
/*******************************************************/
struct Then
{
    void operator()(Iter * I, int parm)  {  I->Func0(parm);  }
};
struct Else
{
    void operator()(Iter * I, int parm)  {  I->Func1(parm);  }
};
 
template <size_t n>
void func(Iter * I, int parm)
{
    I->Reset();
    while (I->Next())
    {
        //тут много совпадающего кода
        static_if<n == 0, Then, Else>()(I, parm);
    }
}
 
void func0(Iter * I, int parm)
{
    func<0>(I, parm);
}
 
void func1(Iter * I, int parm)
{
    func<1>(I, parm);
}
Мыслите шире, короче

Добавлено через 2 минуты
Цитата Сообщение от nonenever Посмотреть сообщение
лучше чем передавать параметрами.
Далеко не всегда. Тут важно выбрать, что важнее: количество кода или количество вызовов.
0
0 / 0 / 2
Регистрация: 19.06.2017
Сообщений: 28
19.06.2017, 16:36  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
эмулировали
Похоже это должно работать в целом как нужно.
Но (насколько я понял) стек дергает лишний раз, что не хорошо - но хотя бы не бранчит.
Цитата Сообщение от DrOffset Посмотреть сообщение
что важнее
Скорость, разумеется.
При прочих равных - минимум бойлерплейта.
А количество кода как такового не особенно важно, у меня не тот случай чтобы в L1 не лезло.
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
19.06.2017, 16:54
Цитата Сообщение от nonenever Посмотреть сообщение
Но (насколько я понял) стек дергает лишний раз, что не хорошо - но хотя бы не бранчит.
В данном конкретном варианте все нормально заинлайнится. Никто никого не дернет
В боевом коде, да, надо смотреть, но если не злоупотреблять, то тоже все будет хорошо. Ну и, конечно же, проверяй ассемблер, если хочешь знать наверняка.

Добавлено через 15 минут
Цитата Сообщение от nonenever Посмотреть сообщение
Но (насколько я понял) стек дергает лишний раз, что не хорошо - но хотя бы не бранчит.
Все, до меня дошло - ты думаешь, что если ты сделаешь лишнюю функцию, то обязательно лишний раз дернет стек. Так вот - если делать это с умом, то нет, не дернет.
Смотри сюда:
https://godbolt.org/g/yo18Vi
Как видишь, я взял старый компилятор GCC 4.4.7, с опцией оптимизации -O1. Если переписать этот код без всех ухищрений, копи-пастом, то получим абсолютно тоже самое:
https://godbolt.org/g/irBrpj

Вывод - не надо бояться функций
0
0 / 0 / 2
Регистрация: 19.06.2017
Сообщений: 28
19.06.2017, 16:57  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
все нормально заинлайнится
С той же степенью уверенности можно сказать что лишние ветки в ифах по параметру шаблона порежутся.
Правда, операторный вариант гораздо страшнее - и это хорошо, люблю такие штуки.

Добавлено через 1 минуту
Цитата Сообщение от DrOffset Посмотреть сообщение
обязательно лишний раз дернет стек
Именно так и думаю, и вообще не верю ни людям ни железкам.
Поэтому везде где надо сам ставлю inline.
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
19.06.2017, 16:59
Цитата Сообщение от nonenever Посмотреть сообщение
С той же степенью уверенности можно сказать что лишние ветки в ифах по параметру шаблона порежутся.
Да, но в обычном ифе нельзя будет вставить невычислимый в данном (шаблонном) варианте контекст. Если у тебя есть такие случаи, как в примере поста #23, то простым if`ом не отделаешься.

Добавлено через 1 минуту
Цитата Сообщение от nonenever Посмотреть сообщение
Именно так и думаю, и вообще не верю ни людям ни железкам.
Поэтому везде где надо сам ставлю inline.
Я тебе выше дизассемблер дал. Чего еще надо?
0
0 / 0 / 2
Регистрация: 19.06.2017
Сообщений: 28
19.06.2017, 17:01  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
как в примере поста #23, то простым if`ом не отделаешься.
Не понял. Именно там и есть чисто константное выражение, и с простым ифом должно все порезать как надо.
size_t - это практически инт, насколько я помню.

Добавлено через 31 секунду
Цитата Сообщение от DrOffset Посмотреть сообщение
Чего еще надо?
Счастья всем, даром.
И пусть никто не уйдет.
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
19.06.2017, 17:03
Цитата Сообщение от nonenever Посмотреть сообщение
Не понял. Именно там и есть чисто константное выражение, и с простым ифом должно все порезать как надо.
size_t - это практически инт, насколько я помню.
Пример, в посте #23, посмотри
0
0 / 0 / 2
Регистрация: 19.06.2017
Сообщений: 28
19.06.2017, 17:05  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
#23
А, пардон, туплю - авто конечно работать не будет.
И это хорошо - динамикой пусть в пхп и прочих питонах развлекаются.
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
19.06.2017, 17:10
C++
1
2
3
4
5
6
7
8
9
template<size_t N>
auto func(){
    if(N==0){
         return 10;
    }
    else{
        return string("ten");
    }
}
http://rextester.com/UNIOP98803
Не скомпилируется это. Если есть подобные случаи и нет доступного constexpr if, то делать придется так, как я выше показывал. Ну или вариации на тему.

Добавлено через 4 минуты
Цитата Сообщение от nonenever Посмотреть сообщение
А, пардон, туплю - авто конечно работать не будет.
И это хорошо - динамикой пусть в пхп и прочих питонах развлекаются.
Зачем спешишь? auto - это вообще не динамика. auto - это этап компиляции. А ошибка там от того, что if требует вычислимости всех веток, а типы в return в этих ветках - разные. Вот компилятор и не может на этапе компиляции определить сигнатуру инстанцированной функции.
0
0 / 0 / 2
Регистрация: 19.06.2017
Сообщений: 28
19.06.2017, 17:16  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
auto - это этап компиляции
И динамика - во всяком случае шаг именно в этом направлении.
Через пару стандартов будет и настоящая, процесс скатывания в пхп необратим.
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
19.06.2017, 17:29
Цитата Сообщение от nonenever Посмотреть сообщение
И динамика - во всяком случае шаг именно в этом направлении.
Не путайте динамическую типизацию и автоматический вывод типа в статической.
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
19.06.2017, 17:31
Цитата Сообщение от nonenever Посмотреть сообщение
И динамика - во всяком случае шаг именно в этом направлении.
Через пару стандартов будет и настоящая, процесс скатывания в пхп необратим.
Нет не в этом. Auto - это такой шаблон по месту в выражении. Не более. Язык С++ статически типизирован, auto - выводит тип выражения. Статический тип (других в С++ нет).
С++ никогда не станет динамически типизированным языком, т.к. это сломает всю его наследственность. Столько усилий сейчас прикладывают в комитете для того, что добавить в язык новые возможности, при этом сохранив совместимость со старым кодом, очень неохотно отказываются от давно неиспользуемых вещей. Это огромная работа по вписыванию новых концепций в старую архитектуру, где нужно и legacy поддержать и not-pay-for-what-you-don't-use обеспечить. И тут бац, такое кардинальное изменение - смена всей парадигмы, которая сделает из С++, по сути, новый язык. Зачем нужно было столько страдать, чтобы разом все сломать? Нет, этого не будет никогда. А если кто-то считает, что будет - он просто вообще, полностью и бесповоротно не понимает С++ и его философию.
0
0 / 0 / 2
Регистрация: 19.06.2017
Сообщений: 28
19.06.2017, 17:38  [ТС]
Цитата Сообщение от MrGluck Посмотреть сообщение
Не путайте
Для компилируемых языков это оно и есть, достаточно сделать auto опциональным.
Насколько я в курсе, другой динамики для компилируемых вообще не бывает.
И да, динамика/статика и строгая/нестрогая - это почти ортогональные вещи.

Добавлено через 3 минуты
Цитата Сообщение от DrOffset Посмотреть сообщение
Зачем нужно было столько страдать, чтобы разом все сломать?
Чтобы продвинуть Go и Java, очевидно же.
Цитата Сообщение от DrOffset Посмотреть сообщение
этого не будет никогда.
Цитата Сообщение от DrOffset Посмотреть сообщение
не понимает С++ и его философию
Похоже на аутотренинг и сеанс самовнушения.
0
19.06.2017, 17:42

Не по теме:

Цитата Сообщение от nonenever Посмотреть сообщение
Похоже на аутотренинг и сеанс самовнушения.
Всего вам хорошего, уважаемый :)

0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
19.06.2017, 17:46
nonenever, я могу вам только одно сказать - https://habrahabr.ru/post/161205/
0
0 / 0 / 2
Регистрация: 19.06.2017
Сообщений: 28
19.06.2017, 17:55  [ТС]
Цитата Сообщение от MrGluck Посмотреть сообщение
https://habrahabr.ru/post/161205/
Все верно, это мой тезис из #37 в развернутом виде:
1) Динамики в классическом виде в компилируемых языках не бывает, самое похожее что есть - это авто.
2) Динамика/статика и строгая/нестрогая - ортогональные понятия.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
19.06.2017, 17:55
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
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
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru