13

std::unordered_map を見ていて、文字列をキーとして使用したい場合は、ファンクターを含むクラスを作成する必要があることがわかりました。

好奇心から、これの代わりにラムダを使用できるかどうか疑問に思っていました。

作業中のオリジナルは次のとおりです。

struct hf
{
  size_t operator()(string const& key) const
  {
    return key[0];  // some bogus simplistic hash. :)
  }
}

std::unordered_map<string const, int, hf> m = {{ "a", 1 }};

これが私の試みです:

std::unordered_map<string const, int, [](string const& key) ->size_t {return key[0];}> m = {{ "a", 1 }};

次のエラーで失敗しました:

exec.cpp: In lambda function:
exec.cpp:44:77: error: ‘key’ cannot appear in a constant-expression
exec.cpp:44:82: error: an array reference cannot appear in a constant-expression
exec.cpp: At global scope:
exec.cpp:44:86: error: template argument 3 is invalid
exec.cpp:44:90: error: invalid type in declaration before ‘=’ token
exec.cpp:44:102: error: braces around scalar initializer for type ‘int’

エラーを考えると、ランバはファンクターとは十分に異なるため、定数式ではないように思われます。あれは正しいですか?

4

1 に答える 1

12

ラムダ関数を渡す方法は次のとおりです。

auto hf = [](string const& key)->size_t { return key[0]; };

unordered_map<string const, int, decltype(hf)> m (1, hf);
                                 ^^^^^^^^^^^^        ^^
                                 passing type        object

の出力decltype(hf)は、デフォルトのコンストラクターを持たないクラス型です (によって削除され=deleteます)。unordered_mapしたがって、オブジェクトをコンストラクターで渡して、ラムダ オブジェクトを構築できるようにする必要があります。

于 2013-05-26T20:30:14.117 に答える