как реализовать именованный параметр, подобный свойству, в c

#c #named-parameters

#c #named-parameters

Вопрос:

У меня есть функция сортировки внутри массива классов, и я хотел добиться чего-то подобного в python sort(reverse=True) . Я хочу показать пользователю, что они могут передавать этот параметр, потому что прямо сейчас arr.bubble_sort(true); (проверьте код) доза не имеет особого смысла. Я не хочу, чтобы лямбда-функции имели представление о том, как этого добиться.
Любой другой метод также работает, потому что я знаю, что именованных параметров, вероятно, нет в c .

PS: Кстати, я его перегрузил.
С уважением,

 
// inside class Array

void bubble_sort(bool rev){   //overloaded bubble_sort
        if(rev){
            int i,j;
            for(i=0; i<size-1; i  ){
                for(j=0; j<size-i-1; j  ){
                    if(arr[j] < arr[j 1]){
                        std::swap(arr[j], arr[j 1]);
                    }
                }
            }
        }
        else{
            int i,j;
            for(i=0; i<size-1; i  ){
                for(j=0; j<size-i-1; j  ){
                    if(arr[j] > arr[j 1]){
                        std::swap(arr[j], arr[j 1]);
                    }
                }
            }
        }
    }


int main()
{
    int n;
    std::cin >> n;
    Array arr(n); // parameterized constructor initializing array of size n
    arr.bubble_sort(true);
    arr.print();

   return 0;
}
  

Комментарии:

1. В c нет такой функции, как именованные параметры .

2. Нет, вы не перегрузили bubble_sort , по крайней мере, не в коде, который вы показали. Но перегрузка была бы элегантным решением. Или используйте значение по умолчанию для rev .

3. Здесь можно использовать некоторый параметр времени компиляции if constexpr , чтобы избежать дублирования кода.

4. Есть ли какая-либо причина, по которой вы используете bubblesort вместо std::sort ?

5. На самом деле я просто не учусь.

Ответ №1:

Просто предоставьте это перегрузкам:

 void bubble_sort(std::function<bool<int, int>> cmp) {
    ...
                    if(cmp(arr[j], arr[j 1])){
                        std::swap(arr[j], arr[j 1]);
                    }
    ...
}

void bubble_sort(bool rev = false)
{
    bubble_sort(rev ? std::greater<int>{} : std::less<int>{});
}
  

Обратите внимание, что в c используется статический типизированный язык, поэтому перегрузки можно различать по типу аргумента.

Комментарии:

1. Если компилятор недостаточно умен, cmp здесь будет виртуальный вызов.

2. да, но он новичок, и эта деталь не важна с его точки зрения. Знакомить его с шаблонами было бы излишним.