0

map比較ファンクターをコンストラクター引数として渡すことができない理由はありますか?

map<int, string, greater<int>> foo;
//map<int, string> foo(greater<int>()); Doesn't work

または、独自の比較型を提供しないとラムダを渡すことができない理由:

map<int, string, function<bool(const int&, const int&)>> bar([](const int& lhs, const int& rhs){ return lhs > rhs; });
//map<int, string> bar([](const int& lhs, const int& rhs){ return lhs > rhs; }); Doesn't work

map<int, string>コンパレータで宣言して構築できるようにしたいのですが。なぜできないのですか?

実例

4

1 に答える 1

1

この質問は誤解から生じています。それをクリアするには:

ファンクターは関数ではなくオブジェクトです

関数ポインターまたはラムダをオブジェクトに割り当てようとしても意味がありません。したがって、これは実行できません。関数ポインターまたはラムダを取る amap<int, string> bar([](const int& lhs, const int& rhs){ return lhs > rhs; });を定義する方法は、質問のテンプレート引数を使用することです。mapmap<int, string, function<bool(const int&, const int&)>>

質問の 2 つの考えられないオプションの中間には、別の誤解map<int, string, [](const int& lhs, const int& rhs){ return lhs > rhs; }>があります。コンパレーター テンプレートの引数は、初期化値ではなく、のメンバー型であるため、機能しません。したがって、関数ポインタまたはラムダ コンパレータを使用する場合は、常にその値がコンストラクタに渡される必要があります。それ以外の場合は、.mapmapmapmap<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>>十分です。

于 2016-03-07T12:43:47.167 に答える