#include <functional>
#include <iostream>
#include <vector>
template <class RetType, class Arg1, class ...Args>
std::vector<RetType> map(RetType (*fnc)(Arg1, Args...), std::vector<Arg1> arg1, std::vector<Args> ... args)
{
// TODO assert что все вектора имеют одинаковый размер
std::vector<RetType> ret;
for(int i = 0; i < arg1.size(); ++i)
ret.push_back(fnc(arg1[i], args[i]...));
return ret;
}
char f(std::string s, int p)
{
return s.at(p);
}
template<int N>
char fn(std::string s)
{
return s.at(N);
}
int main() {
// один map
std::vector<std::string> a = {"LISP", "SICP", "THE", "BEST", "MUST", "HAVE"};
std::vector<int> b = {2, 2, 1, 1, 0, 3};
for(auto c : map(f, a, b))
std::cout << c;
std::cout << std::endl;
// map от map
std::vector<std::vector<std::string>> A = {{"IT", "SO", "TRUE"}, {"THAT", "NEVER", "ABANDON"}, {"THE", "LISP", "SITE"}};
std::vector<char(*)(std::string)> F = {fn<0>, fn<1>, fn<2>};
for(auto list : map(map<char, std::string>, F, A))
for(auto c : list)
std::cout << c;
}
I2luY2x1ZGUgPGZ1bmN0aW9uYWw+CiNpbmNsdWRlIDxpb3N0cmVhbT4KI2luY2x1ZGUgPHZlY3Rvcj4KCnRlbXBsYXRlIDxjbGFzcyBSZXRUeXBlLCBjbGFzcyBBcmcxLCBjbGFzcyAuLi5BcmdzPgpzdGQ6OnZlY3RvcjxSZXRUeXBlPiBtYXAoUmV0VHlwZSAoKmZuYykoQXJnMSwgQXJncy4uLiksIHN0ZDo6dmVjdG9yPEFyZzE+IGFyZzEsIHN0ZDo6dmVjdG9yPEFyZ3M+IC4uLiBhcmdzKQp7CgkvLyBUT0RPIGFzc2VydCDRh9GC0L4g0LLRgdC1INCy0LXQutGC0L7RgNCwINC40LzQtdGO0YIg0L7QtNC40L3QsNC60L7QstGL0Lkg0YDQsNC30LzQtdGACglzdGQ6OnZlY3RvcjxSZXRUeXBlPiByZXQ7Cglmb3IoaW50IGkgPSAwOyBpIDwgYXJnMS5zaXplKCk7ICsraSkKCQlyZXQucHVzaF9iYWNrKGZuYyhhcmcxW2ldLCBhcmdzW2ldLi4uKSk7CglyZXR1cm4gcmV0Owp9CgpjaGFyIGYoc3RkOjpzdHJpbmcgcywgaW50IHApCnsKCXJldHVybiBzLmF0KHApOwp9Cgp0ZW1wbGF0ZTxpbnQgTj4KY2hhciBmbihzdGQ6OnN0cmluZyBzKQp7CglyZXR1cm4gcy5hdChOKTsKfQoKaW50IG1haW4oKSB7CgkvLyDQvtC00LjQvSBtYXAKCXN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBhID0geyJMSVNQIiwgIlNJQ1AiLCAiVEhFIiwgIkJFU1QiLCAiTVVTVCIsICJIQVZFIn07CglzdGQ6OnZlY3RvcjxpbnQ+IGIgPSB7MiwgMiwgMSwgMSwgMCwgM307Cglmb3IoYXV0byBjIDogbWFwKGYsIGEsIGIpKQoJCXN0ZDo6Y291dCA8PCBjOwoJc3RkOjpjb3V0IDw8IHN0ZDo6ZW5kbDsKCS8vIG1hcCDQvtGCIG1hcAoJc3RkOjp2ZWN0b3I8c3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+PiBBID0ge3siSVQiLCAiU08iLCAiVFJVRSJ9LCB7IlRIQVQiLCAiTkVWRVIiLCAiQUJBTkRPTiJ9LCB7IlRIRSIsICJMSVNQIiwgIlNJVEUifX07CglzdGQ6OnZlY3RvcjxjaGFyKCopKHN0ZDo6c3RyaW5nKT4gRiA9IHtmbjwwPiwgZm48MT4sIGZuPDI+fTsKCWZvcihhdXRvIGxpc3QgOiBtYXAobWFwPGNoYXIsIHN0ZDo6c3RyaW5nPiwgRiwgQSkpCgkJZm9yKGF1dG8gYyA6IGxpc3QpCgkJCXN0ZDo6Y291dCA8PCBjOwp9