Перегрузка функций по имени параметра

98
05 декабря 2021, 06:20

Такой вопрос, (я только учусь, так что не бейте) есть функция, которая удаляет элемент из массива:

void arrayEditingDel(int *&arr, int &size, int numdel){}

Есть та, которая добавляет:

void arrayEditingAdd(int *&arr, int &size, int newValue){}

Почему бы не перегрузить одну функцию, вместо того, чтобы создавать две, верно?) Но мы ведь знаем, что перегружать функции можно либо по вз. типу, либо по кол-ву аргументов. И действительно, компилятор на попытку ругается:

void arrayEditing(int *&arr, int &size, int numdel){}

void arrayEditing(int *&arr, int &size, int newValue){}

В итоге, я своего добился, и перегрузку сделал:

void arrayEditing(int *&arr, int &size, int numdel){}

void arrayEditing(int *&arr, int &size, int numdel, int newValue){}

Но все это ценой бессмысленного действия (int numdel не используется при добавлении элемента в массив).

Вот собственно и вопрос: почему нельзя добавить возможность перегрузки по имени переменной? Компилятор спокойно, при вызове функции, сможет понять, какую реализацию ему задействовать. Или нет?

В общем, это несовершенство языка, или (скорее всего) моя некомпетентность?)

Answer 1

Перегрузку по имени параметра функций сделать нельзя. Причин тому, как минимум три:

  1. Имя параметра не является обязательным, т.е. вполне валидна функция, определённая как void f(int). Для вызова требуется целочисленный параметр, но имени у него нет и достучаться до него переносимым способом нельзя.

  2. Имя параметра может отличаться в объявлении (например, в .h-файле) и определении (например, .cpp-файле) функции.

    // заголовочный файл 
    void f(int a); 
    // файл реализации
    void f(int b) {
        // do something
    } 
    
  3. В месте вызова функции формальное имя параметра не используется. Например, объявление функции выглядит как void f(int a);, а вызов такой:

    int c = 42;  
    f(c);
    

    Или даже такой:

    f(42);
    

    Если бы была возможность существовать одновременно нескольким функциям, типа void f(int a) и void f(int b), то было бы совершенно неясно, какую из них следует вызывать.

Более того, если вернуться к вашей идее, то давать одинаковые имена функциям, делающий радикально разные действия, не очень хорошая мысль. Намного удобнее, когда действие сразу отражено в названии функции (Add, Del из вашего вопроса). В таком случае, не нужно переходить к месту определения/объявления и читать код или описание того, что же действительно делает функция, принимающая такие-то параметры в таком-то порядке.

READ ALSO
16-тиричное считывание из файла C++

16-тиричное считывание из файла C++

Излазил вдоль и поперек форум(скорее всего чего-то не заметил)

79
Сравнение производительности QQuickItem и QQuickpaintedItem

Сравнение производительности QQuickItem и QQuickpaintedItem

не нашел четкого сравнения двух этих методов рисования виджетаОдин способ это рисовать все в paint()

91
Property does not exist on type 'JQuery<HTMLElement>'

Property does not exist on type 'JQuery<HTMLElement>'

Создаю плагин для jQuery:

181
ContentControl и DataTemplate в WPF

ContentControl и DataTemplate в WPF

Могу ли я динамически менять содержимое GroupBox таким способом

150