#include <map>
#include <functional>
#include <string>
#include <iostream>
using ::std::string;
template<typename Key, typename Value, template <typename, typename> class Map>
struct ForEachOf {
void operator()(const Map<Key, Value>& map, std::function<void (Key, Value)> func) {
for(const auto& pair : map) {
func(pair.first, pair.second);
}
}
};
template<typename key, typename value>
using mymap = std::map<key, value>;
int main(void) {
mymap<int, string> m { {1, "foo"}, {3, "bar"}};
ForEachOf<int, string, mymap> forEachOf;
forEachOf(m, [](int key, string value) {
::std::cout << key << value;
});
}
I2luY2x1ZGUgPG1hcD4KI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CiNpbmNsdWRlIDxzdHJpbmc+CiNpbmNsdWRlIDxpb3N0cmVhbT4KCnVzaW5nIDo6c3RkOjpzdHJpbmc7Cgp0ZW1wbGF0ZTx0eXBlbmFtZSBLZXksIHR5cGVuYW1lIFZhbHVlLCB0ZW1wbGF0ZSA8dHlwZW5hbWUsIHR5cGVuYW1lPiBjbGFzcyBNYXA+CnN0cnVjdCBGb3JFYWNoT2YgewogICAgdm9pZCBvcGVyYXRvcigpKGNvbnN0IE1hcDxLZXksIFZhbHVlPiYgbWFwLCBzdGQ6OmZ1bmN0aW9uPHZvaWQgKEtleSwgVmFsdWUpPiBmdW5jKSB7CiAgICAgICAgZm9yKGNvbnN0IGF1dG8mIHBhaXIgOiBtYXApIHsKICAgICAgICAgICAgZnVuYyhwYWlyLmZpcnN0LCBwYWlyLnNlY29uZCk7CiAgICAgICAgfQogICAgfQp9OwoKCXRlbXBsYXRlPHR5cGVuYW1lIGtleSwgdHlwZW5hbWUgdmFsdWU+Cgl1c2luZyBteW1hcCA9IHN0ZDo6bWFwPGtleSwgdmFsdWU+OwoKaW50IG1haW4odm9pZCkgewoJbXltYXA8aW50LCBzdHJpbmc+IG0geyB7MSwgImZvbyJ9LCB7MywgImJhciJ9fTsKCUZvckVhY2hPZjxpbnQsIHN0cmluZywgbXltYXA+IGZvckVhY2hPZjsKICAgIGZvckVhY2hPZihtLCBbXShpbnQga2V5LCBzdHJpbmcgdmFsdWUpIHsKICAgICAgICA6OnN0ZDo6Y291dCA8PCBrZXkgPDwgdmFsdWU7CiAgICB9KTsKfQo=