#include <iostream>
#include <string>
#include <map>
#include <functional>
struct assoc_find_type {
template<typename AssocContainer>
auto operator ()(AssocContainer & container) const
-> decltype(std::bind(assoc_find_type{}, std::ref(container), std::placeholders::_1)) {
return std::bind(assoc_find_type{}, std::ref(container), std::placeholders::_1);
}
template<typename AssocContainer>
typename AssocContainer::iterator
operator ()(AssocContainer & container, typename AssocContainer::key_type const& key) const {
return container.find(key);
}
template<typename AssocContainer>
typename AssocContainer::const_iterator
operator ()(AssocContainer const& container, typename AssocContainer::key_type const& key) const {
return container.find(key);
}
};
constexpr assoc_find_type assoc_find;
int main()
{
using map_t = std::map<std::string, int>;
map_t map { {"A", 10}, {"B", 11}, {"C", 12}, {"D", 13}, {"E", 14}, {"F", 15} };
auto f = assoc_find(map);
f("A")->second = 42;
auto u = assoc_find(map);
std::cout << u("A")->second << std::endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8bWFwPgojaW5jbHVkZSA8ZnVuY3Rpb25hbD4KCgpzdHJ1Y3QgYXNzb2NfZmluZF90eXBlIHsKCQogICB0ZW1wbGF0ZTx0eXBlbmFtZSBBc3NvY0NvbnRhaW5lcj4KICAgYXV0byBvcGVyYXRvciAoKShBc3NvY0NvbnRhaW5lciAmIGNvbnRhaW5lcikgY29uc3QKICAgICAgICAgLT4gZGVjbHR5cGUoc3RkOjpiaW5kKGFzc29jX2ZpbmRfdHlwZXt9LCBzdGQ6OnJlZihjb250YWluZXIpLCBzdGQ6OnBsYWNlaG9sZGVyczo6XzEpKSB7CiAgICAgIHJldHVybiBzdGQ6OmJpbmQoYXNzb2NfZmluZF90eXBle30sIHN0ZDo6cmVmKGNvbnRhaW5lciksIHN0ZDo6cGxhY2Vob2xkZXJzOjpfMSk7ICAgICAgCQogICB9CiAgIAogICB0ZW1wbGF0ZTx0eXBlbmFtZSBBc3NvY0NvbnRhaW5lcj4KICAgdHlwZW5hbWUgQXNzb2NDb250YWluZXI6Oml0ZXJhdG9yCiAgIG9wZXJhdG9yICgpKEFzc29jQ29udGFpbmVyICYgY29udGFpbmVyLCB0eXBlbmFtZSBBc3NvY0NvbnRhaW5lcjo6a2V5X3R5cGUgY29uc3QmIGtleSkgY29uc3QgewogICAgICByZXR1cm4gY29udGFpbmVyLmZpbmQoa2V5KTsKICAgfQogICAKICAgdGVtcGxhdGU8dHlwZW5hbWUgQXNzb2NDb250YWluZXI+CiAgIHR5cGVuYW1lIEFzc29jQ29udGFpbmVyOjpjb25zdF9pdGVyYXRvcgogICBvcGVyYXRvciAoKShBc3NvY0NvbnRhaW5lciBjb25zdCYgY29udGFpbmVyLCB0eXBlbmFtZSBBc3NvY0NvbnRhaW5lcjo6a2V5X3R5cGUgY29uc3QmIGtleSkgY29uc3QgewogICAgICByZXR1cm4gY29udGFpbmVyLmZpbmQoa2V5KTsKICAgfQp9OwoKY29uc3RleHByIGFzc29jX2ZpbmRfdHlwZSBhc3NvY19maW5kOwoKCmludCBtYWluKCkKewogICB1c2luZyBtYXBfdCA9IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBpbnQ+OwogICBtYXBfdCBtYXAgeyB7IkEiLCAxMH0sIHsiQiIsIDExfSwgeyJDIiwgMTJ9LCB7IkQiLCAxM30sIHsiRSIsIDE0fSwgeyJGIiwgMTV9IH07CiAKICAgYXV0byBmID0gYXNzb2NfZmluZChtYXApOwogICBmKCJBIiktPnNlY29uZCA9IDQyOwogICAKICAgYXV0byB1ID0gYXNzb2NfZmluZChtYXApOwogICBzdGQ6OmNvdXQgPDwgdSgiQSIpLT5zZWNvbmQgPDwgc3RkOjplbmRsOwogCiAgIHJldHVybiAwOwp9