18

map::compareラムダを使用して関数をオーバーライドしようとすると、次の解決策が機能するようです。

auto cmp = [](const int&a, const int& b) { return a < b; };
std::map<int, int, decltype(cmp)> myMap(cmp);

しかし、最初に定義cmpして後で使用する必要がありました。
「cmp」を定義せずにこれを行うことはできますか?

4

4 に答える 4

25

いいえ、評価されていないコンテキストでラムダを使用することはできません。つまり、例のようにテンプレートパラメーターです。したがって、別の場所で ( を使用して)定義してから... を使用する必要があります。もう 1 つの方法は、既に述べたように、「序数」ファンクターを使用することです。autodecltype

あなたの質問が「マップを定義するときにラムダ式を*一度*使用する方法」に関するものである場合、ラムダの暗黙的な変換を利用して、次のstd::functionようにすることができます。

#include <iostream>
#include <functional>
#include <map>

int main()
{
    auto m = std::map<int, int, std::function<bool(const int&, const int&)>>{
        [](const int& a, const int& b)
        {
            return a < b;
        }
    };
    return 0;
}

map後で入力を減らすために、そのタイプのエイリアスを導入することができます...

于 2013-08-04T16:58:22.837 に答える
7
#include <iostream>
#include <functional>
#include <map>
#include <typeinfo>

typedef std::map< int, int, std::function<bool(const int&, const int&)> > MyMap;

int main()
{
    auto cmp = [](const int& a, const int& b) { return a < b; };
    MyMap map(cmp);

    return 0;
}

コンパレーター型に適切な型シグネチャを提供するために使用std::functionすると、マップ型を定義してから、必要なラムダ比較を割り当てることができます。

于 2013-08-04T17:16:42.307 に答える