この質問は誤解から生じています。それをクリアするには:
ファンクターは関数ではなくオブジェクトです
関数ポインターまたはラムダをオブジェクトに割り当てようとしても意味がありません。したがって、これは実行できません。関数ポインターまたはラムダを取る amap<int, string> bar([](const int& lhs, const int& rhs){ return lhs > rhs; });
を定義する方法は、質問のテンプレート引数を使用することです。map
map<int, string, function<bool(const int&, const int&)>>
質問の 2 つの考えられないオプションの中間には、別の誤解map<int, string, [](const int& lhs, const int& rhs){ return lhs > rhs; }>
があります。コンパレーター テンプレートの引数は、初期化値ではなく、のメンバーの型であるため、機能しません。したがって、関数ポインタまたはラムダ コンパレータを使用する場合は、常にその値がコンストラクタに渡される必要があります。それ以外の場合は、.map
map
map
map<int, string, function<bool(const int&, const int&)>> bar([](const int& lhs, const int& rhs){ return lhs > rhs; })
function<bool(const int&, const int&)>()
map
これはおそらくすでに明らかですが、ファンクターはオブジェクトであるため、無関係なオブジェクトを渡すことはできません。これは、まったく異なるタイプのオブジェクトの構築値です。呼び出すmap<int, string> foo(greater<int>())
ことは、 を呼び出すようなものless<int> foo = greater<int>
です。コンパレーター テンプレート引数がファンクターであるへの唯一の受け入れ可能なコンパテーター コンストラクター引数map
は、テンプレート引数でファンクター型のオブジェクトに変換できるものです:map<int, string, greater<int>> foo(greater<int>{})
これは明らかに不要greater<int>
です。同じメンバーの初期化がmap
行われるため、map<int, string, greater<int>>
十分です。