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

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

19.06.2017, 14:05. Показов 2214. Ответов 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
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
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
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
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
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
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
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
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
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
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
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
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
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
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
Ответ Создать тему
Новые блоги и статьи
28. КОнкретное развертывание плана номер 1 из поста номер 27
anaschu 22.06.2026
Можно ли из модели получить конкретные строительные требования? Честно — напрямую из текущей модели такие ответы не получить. Но цепочка логики есть, и она не такая длинная. Где разрыв . . .
27. Планы на разработку функциональных требований к строительству внутри модели пищеблока (или не только его?)
anaschu 22.06.2026
Что уже реализовано и даёт конфликты «бесплатно» Самый простой конфликт уже работает — конфликт за ресурс-работника. Заданий больше, чем доступных поваров → очередь в queue1. Это прямое отражение. . .
26. мед мат модель.Какие типы конфликтов функциональных требований можно рассчитать через ДЕС-моделирование (СМО) в AnyLogic?
anaschu 22.06.2026
Что ДЕС/ СМО умеет считать напрямую: Конфликты за ресурсы (очереди, узкие места). Несколько типов агентов (повара, учителя, рабочие, пациенты) претендуют на один ресурс (лифт, вход, коридор,. . .
25 модель здравосохранения и функциональных требований к пищеблоку: конфликты функциональных требований.
anaschu 22.06.2026
Есть ли данные о том, какие функциональные/ эксплуатационные требования или их сочетания труднее всего учитывать при проектировании зданий? Да, такие данные есть, и они хорошо описаны и в российской,. . .
Remote Connection Manager
DevAlt 21.06.2026
Написал для себя небольшую прилагу: https:/ / github. com/ altbodhi/ ReConMan По итогу пришел к мысли, что DU не дружат с существующими технологиями. От сериализации до отображения в реляционную. . .
Администрация Хабра удаляет новые энрегоэфективные алгоритмы, которые не западной школы кода, и вовсе никак не сгенерировавны.
Hrethgir 20.06.2026
Делается это, как замечено, при правках - при объявлении концептуальных отличий в алгоримах. Делается это, по линейке событий - после дополнения публикации основными отличиями от основных западных. . .
Процесс ориентированная диалектика (не новость - просто системное обновление, философия).
Hrethgir 20.06.2026
Однажды один участник в своём блоге, на этом форуме, сделал запись "О языках замолвите слово". Понимая, что язык - важная вещь, я решил хорошо подумать, прежде чем сказать, и сказал то, что вы видите. . .
Контроль уникальности строк в табличной части документа
Maks 18.06.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ПланированиеСпецтехники" с табличной частью "НаличиеОборудования", разработанного в КА2. Задача: контроль уникальности строк в. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru