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