map::compare
ラムダを使用して関数をオーバーライドしようとすると、次の解決策が機能するようです。
auto cmp = [](const int&a, const int& b) { return a < b; };
std::map<int, int, decltype(cmp)> myMap(cmp);
しかし、最初に定義cmp
して後で使用する必要がありました。
「cmp」を定義せずにこれを行うことはできますか?
いいえ、評価されていないコンテキストでラムダを使用することはできません。つまり、例のようにテンプレートパラメーターです。したがって、別の場所で ( を使用して)定義してから... を使用する必要があります。もう 1 つの方法は、既に述べたように、「序数」ファンクターを使用することです。auto
decltype
あなたの質問が「マップを定義するときにラムダ式を*一度*使用する方法」に関するものである場合、ラムダの暗黙的な変換を利用して、次の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
後で入力を減らすために、そのタイプのエイリアスを導入することができます...
#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
すると、マップ型を定義してから、必要なラムダ比較を割り当てることができます。