【问题标题】:how to implement named parameter like property in c++如何在c ++中实现命名参数,如属性
【发布时间】:2021-02-07 18:36:22
【问题描述】:

我在类 Array 中有一个排序函数,并希望在 python sort(reverse=True) 中实现类似的功能。我想告诉用户他们可以传递这个参数,因为现在arr.bubble_sort(true);(检查代码)没有多大意义。我不希望 lambda 函数知道如何实现这一点。
任何其他方法也有效,因为我知道命名参数在 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;
}

【问题讨论】:

  • 在c++中没有像命名参数这样的功能。
  • 不,您没有重载bubble_sort,至少在您显示的代码中没有。但重载它将是一个优雅的解决方案。或为rev 使用默认值。
  • 这里可以使用一些编译时参数+if constexpr来避免代码重复。
  • 你有什么理由使用冒泡排序而不是std::sort
  • 我不是真的只是为了学习。

标签: c++ named-parameters


【解决方案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++是静态类型语言,所以重载可以通过参数类型来区分。

【讨论】:

  • 如果编译器不够智能,cmp 将在这里虚拟调用。
  • 是的,但他是初学者,从他的角度来看,这个细节并不重要。向他介绍模板将是矫枉过正。
猜你喜欢
  • 1970-01-01
  • 2022-07-07
  • 2011-09-29
  • 1970-01-01
  • 1970-01-01
  • 2014-12-02
  • 1970-01-01
  • 2021-02-18
  • 1970-01-01
相关资源
最近更新 更多