std :: unordered_map을보고 있었는데 문자열을 키로 사용하고 싶다면 펑터가 포함 된 클래스를 만들어야한다는 것을 알았습니다.템플릿 매개 변수에 람다 함수를 사용할 수 있습니까?
호기심에서 람다를 사용할 수 있는지 궁금합니다. 여기
는 작업 원의 : 다음 오류로 실패
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’
오류 감안할 때, 그것은이 있음을 보일 수있을 것입니다 여기에
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 }};
내 시도이다 lamba는 functor와 충분히 다르므로 상수 표현이 아닙니다. 그 맞습니까?
'std :: hash'는'std :: string'에 특화되어 있습니다. 해시를 향상 시키거나 변경하고 싶지 않으면 무언가를 제공 할 필요가 없습니다. 또한, 당신이하고있는 일에 대해서 생각 해보자.'std :: unordered_map'은 템플릿 인자로 * type *을 기대하며, 람다 식은 정확히 표현식, 즉 * 값이 아닌 * 형식이다. – Xeo
g ++ 컴파일러에서 (v4.5.3 with -std = gnu ++ 0x) 사용하면 문자열 키를 사용할 때 해시 함수를 지정하지 않으면 오류가 발생합니다. – Adrian
그것은 표현 인 것처럼, 그렇습니다. 나는 그것이 답이라고 생각합니다. – Adrian