如何在C++ 11中使用lambda auto参数

A. *_*ohn 26 c++ auto c++11

我有一个C++ 14代码.但是,当我在C++ 11中使用它时,它有一个错误const auto.如何在C++ 11中使用它?

vector<vector <int> > P;  
std::vector<double> f;
vector< pair<double, vector<int> > > X; 
for (int i=0;i<N;i++)
        X.push_back(make_pair(f[i],P[i]));

////Sorting fitness descending order
stable_sort(X.rbegin(), X.rend());
std::stable_sort(X.rbegin(), X.rend(),
                [](const auto&lhs, const auto& rhs) { return lhs.first < rhs.first; });
Run Code Online (Sandbox Code Playgroud)

lee*_*mes 31

C++ 11不支持通用lambdas.这就是autolambda参数列表实际上代表的内容:泛型参数,与函数模板中的参数相当.(注意const这里不是问题.)

你基本上有两个选择:

  1. 输入正确的类型而不是auto.这是的元素类型const auto,这是auto.如果您发现这是不可读的,则typedef可以提供帮助.

    std::stable_sort(X.rbegin(), X.rend(),
                     [](const pair<double, vector<int>> & lhs,
                        const pair<double, vector<int>> & rhs)
                     { return lhs.first < rhs.first; });
    
    Run Code Online (Sandbox Code Playgroud)
  2. 用带有调用操作符模板的仿函数替换lambda .这就是通用lambda基本上是在幕后实现的.lambda非常通用,所以考虑将它放在一些全局实用程序头中.(但不要X输入pair<double, vector<int>>,以防你把它放在标题中.)

    struct CompareFirst {
        template <class Fst, class Snd>
        bool operator()(const pair<Fst,Snd>& l, const pair<Fst,Snd>& r) const {
            return l.first < r.first;
        }
    };
    
    Run Code Online (Sandbox Code Playgroud)
    std::stable_sort(X.rbegin(), X.rend(), CompareFirst());
    
    Run Code Online (Sandbox Code Playgroud)


Nim*_*Nim 11

我知道有一个公认的答案,但你也可以decltype在C++ 11中使用它,它看起来有点凌乱......

stable_sort(X.rbegin(), X.rend(), [](decltype(*X.cbegin()) lhs, decltype(lhs) rhs) { return lhs.first < rhs.first; });
Run Code Online (Sandbox Code Playgroud)

cbegin()在这里使用,因为你得到value_type容器的const正确.


Ric*_*h L 9

不幸的是,通用lambda采用auto(无论是否const)仅是C++ 14的特性.

有关更多详细信息,请参见https://isocpp.org/wiki/faq/cpp14-language#generic-lambdas.