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

Перегрузка операторов c++

17.05.2020, 02:40. Показов 436. Ответов 2

Студворк — интернет-сервис помощи студентам
Здравствуйте, уважаемые программисты!

Возможно ли в c++ создать переменный оператор (не уверен, что такое понятие существует), которому можно присваивать какие-либо операторы?
Нужно для того, что-бы не создавались такие массивные коды:



Дело в том, сам код этих перегрузок отличаются буквально в одном символе, определяющем сам оператор.
То есть, условно говоря, есть ли возможность записать так:
C++
1
int a = b x c;
Где x - один из операторов.

Думал использовать лямбда-функции, но это не совсем то, что нужно.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
17.05.2020, 02:40
Ответы с готовыми решениями:

Что такое "перегрузка операторов"? Каковы принципы работы перегруженных операторов и назначение указателя this
Добрый день . Помогите понять принцип работы перегрузки операторов. объясните пожалуйста в зависимости от чего зависит агрумент при...

Перегрузка операторов
Добрый вечер, вопрос в том, что я пытаюсь перегрузить оператор ++ постфиксно, но на нем падает программа, а перегруженный префиксно...

Перегрузка операторов
Здравствуйте! Сделал класс квадратной матрицы. Содержит конструктор по умолчанию, конструктор с параметрами, конструктор копирования,...

2
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
17.05.2020, 04:41
acesolo, в С++20 ваши двенадцать перегрузок, если у них одинаковое содержимое, можно привести к четырем с помощью шаблона и проверки концепта.
Примерно так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Fraction 
{
public:
    template < FractionArgumentCheck<int, double, Fraction> T >
    Fraction operator*(const T & other) const {
        //....
    }
    template < FractionArgumentCheck<int, double, Fraction> T >
    Fraction operator+(const T & other) const {
        //....
    }
    template < FractionArgumentCheck<int, double, Fraction> T >
    Fraction operator-(const T & other) const {
        //....
    }
    template < FractionArgumentCheck<int, double, Fraction> T >
    Fraction operator/(const T & other) const {
        //....
    }   
 
//............          
};
Реализацию концепта FractionArgumentCheck покажу, если вас устроит этот вариант.

Добавлено через 28 минут
acesolo, кстати, учитывая, что перегрузка +, -, *, / обычно реализуется как свободная дружественная функция, в связи с тем, что требуется обеспечить симметричность использования операций:
C++
1
2
3
4
5
1 + frac;
1.2 + frac;
// и
frac + 1;
frac + 1.2;
Поэтому, как следствие, вам может понадобится для корректной реализации почти в два раза больше перегрузок, чем у вас есть сейчас. Т.е. 20.

В связи с этим, а также и при невозможности использовать новые стандарты C++, можно посмотреть на какой-либо вариант идиомы Бартона-Накмана.
С ней класс мог бы выглядеть так:
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
struct Fraction 
// Добавит 10 перегрузок + и - для различных комбинаций перечисленных
// аргументов на основе предоставленных в классе методов add и sub
    : AdditiveOp<Fraction, int, double, Fraction> 
// Добавит 10 перегрузок * и / для различных комбинаций перечисленных 
// аргументов на основе предоставленных в классе методов div и mul
    , MultiplicativeOp<Fraction, int, double, Fraction> 
{
    template <typename Other>
    Fraction add(Other const &x) const // это реализация сложения. 
    {
        //......
    }
    template <typename Other>
    Fraction sub(Other const &x) const // это реализация вычитания. 
    {
        //......
    }
    template <typename Other>
    Fraction div(Other const &x) const // это реализация деления. 
    {
        //......
    }
    template <typename Other>
    Fraction mul(Other const &x) const // это реализация умножения. 
    {
        //......
    }            
};
Реализацию, как я уже выше сказал, покажу, если кто-то будет в этом заинтересован.
Практика показывает, что чрезмерные предварительные усилия на этом форуме часто не оправданы. Поэтому никакой код я решил пока не писать.

И еще, вы можете найти реализацию и примеры в boost.utility.operators
5
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
17.05.2020, 22:06
Концепт к первой части поста может выглядеть примерно так (нужен C++20):
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
template <class ...T> struct is_any_of;
 
template <class T>
struct is_any_of<T> 
    : std::false_type
{ };
 
template <class T, class U, class... V>
struct is_any_of<T, U, V...>
    : std::integral_constant<bool, std::is_convertible<T, U>() || is_any_of<T, V...>()> 
{ };
 
template <class T, class ...Other>
concept FractionArgumentCheck = is_any_of<T, Other...>::value;

Mix-in`ы на базе идиом Бартона-Накмана и CRTP могут выглядеть примерно так (нужен C++14):
Кликните здесь для просмотра всего текста
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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
template <typename T, typename ...Other> 
class AdditiveOp;
 
template <typename T, typename X, typename ...Other> 
class AdditiveOp<T, X, Other...> : AdditiveOp<T, Other...>
{
    friend auto operator+(T const &a, X const &b) 
    { return a.add(b);  }
    friend auto operator+(X const &a, T const &b) 
    { return b.add(a);  }
 
    friend auto operator-(T const &a, X const &b) 
    { return a.sub(b); }
    friend auto operator-(X const &a, T const &b) 
    { return /*implementation-defined*/;  /*for example T(a).sub(b); */ }
};
template <typename T> 
class AdditiveOp<T, T>
{ 
    friend auto operator+(T const &a, T const &b) 
    { return a.add(b);  }
    friend auto operator-(T const &a, T const &b) 
    { return a.sub(b); }  
};
template <typename T> 
class AdditiveOp<T>
{ };
 
template <typename T, typename ...Other> 
class MultiplicativeOp;
 
template <typename T, typename X, typename ...Other> 
class MultiplicativeOp<T, X, Other...> : MultiplicativeOp<T, Other...>
{
    friend auto operator*(T const &a, X const &b)
    { return a.mul(b);  }
    friend auto operator*(X const &a, T const &b) 
    { return b.mul(a);  }
 
    friend auto operator/(T const &a, X const &b) 
    { return a.div(b); }
    friend auto operator/(X const &a, T const &b) 
    { return /*implementation-defined*/; /*for example T(a).div(b); */ }    
};
template <typename T> 
class MultiplicativeOp<T, T>
{ 
    friend auto operator*(T const &a, T const &b) 
    { return a.mul(b);  }
    friend auto operator/(T const &a, T const &b) 
    { return a.div(b); }  
};
template <typename T> 
class MultiplicativeOp<T>
{ };
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
17.05.2020, 22:06
Помогаю со студенческими работами здесь

Перегрузка операторов
Задание: Создать класс для работы з одномерным массивом целых чисел. Поля : int n, int *Array.Конструктор что позволяет создать массив...

Перегрузка операторов
Приветствую. Вот как выглядит задание: АТД − множество с элементами типа char. Дополнительно пере- грузить следующие операции: ...

Перегрузка операторов
В программе нужно сделать перегрузку оператора умножения, не могу понять что и как делать... Помогите разобраться :) #include...

Перегрузка операторов
Доброго времени суток. на завтра надо сделать работу, а я не могу понять как использовать перегрузку операторов. помогите пожалуйста...

Перегрузка операторов
вот есть такое задание Для заданного по варианту класса выполнить следующие действия: 1) описать все типы конструкторов и деструктор...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
Программный отбор значений справочника
Maks 21.03.2026
Установка программного отбора значений справочника "Сотрудники" из модуля формы документа. В качестве фильтра для отбора служит предопределенное значение перечислений. Процедура. . .
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru