【问题标题】:How to use lambda auto parameters in C++11如何在 C++11 中使用 lambda 自动参数
【发布时间】:2015-05-06 08:32:46
【问题描述】:

我有一个 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; });

【问题讨论】:

  • 是的,从根本上改变问题的编辑在这里真的不合适,我已经删除了它。我知道您在这里发帖的次数不多,而且您所做的事情在论坛上被普遍接受,所以我可以理解您为什么这样做,但可以在这里问很多相关的单独问题,因为只要它们都是本身有意义的好问题。

标签: c++ c++11 auto


【解决方案1】:

C++11 不支持通用 lambdas。这就是 lambda 参数列表中的 auto 实际代表的含义:泛型参数,与函数模板中的参数相当。 (请注意,const 不是这里的问题。)

注意:C++14 确实支持带有 autoconst auto 等的 lambda。您可以阅读有关它的信息 here

你基本上有两种选择

  1. 输入正确的类型,而不是auto。这里是X的元素类型,即pair&lt;double, vector&lt;int&gt;&gt;。如果您发现这不可读,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; });
    
  2. 将 lambda 替换为具有 调用运算符模板的函子。这就是在幕后基本实现通用 lambda 的方式。 lambda 非常通用,因此请考虑将其放在一些全局实用程序标头中。 (但是不要using namespace std;,而是输入std::,以防你把它放在标题中。)

    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;
        }
    };
    
    std::stable_sort(X.rbegin(), X.rend(), CompareFirst());
    

【讨论】:

    【解决方案2】:

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

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

    在此处使用 cbegin(),因为您可以得到容器的 const 正确 value_type

    【讨论】:

      【解决方案3】:

      不幸的是,采用 auto(无论是否为 const)的通用 lambda 是 C++14 独有的功能。

      请参阅此处https://isocpp.org/wiki/faq/cpp14-language#generic-lambdas 了解更多详情。

      【讨论】:

        【解决方案4】:

        或者你可以直接使用容器的value_type typedef 和decltype,比如

        std::stable_sort(X.rbegin(), X.rend(),
                         [](const decltype(X)::value_type & lhs, 
                            const decltype(X)::value_type & rhs)
                            {return lhs.first < rhs.first; }
                        );
        

        【讨论】:

        • 如果我没记错的话,你可以直接输入X.value_type而不是decltype(X)::value_type
        • @leemes 我不这么认为,value_type 是一个嵌套的typedef,所以你需要通过:: 访问范围。直播here,相关问题here
        • 谢谢,我很高兴我的大脑在我认为有可能的时候发出了警告。
        【解决方案5】:

        const auto 在 C++11 中不支持作为 lambda 参数(实际上在 C++11 中不支持泛型 lambda)。

        修复:

        using pair_type = std::pair<double, std::vector<int>>;
        vector<pair_type> X;
        
        std::stable_sort(X.rbegin(), X.rend(),
                        [](const pair_type&lhs, const pair_type& rhs)
                        { return lhs.first < rhs.first; });
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-03-29
          • 2016-06-16
          • 1970-01-01
          • 2021-11-09
          • 1970-01-01
          • 1970-01-01
          • 2012-05-30
          相关资源
          最近更新 更多