February 16th, 2013

Как написать функцию map на C++

Задача: написать такую функцию map, которой можно было бы скормить вектор и функтор или указатель на функцию, которая принимает либо один аргумент (элемент вектора), либо два (еще и его индекс), может что-нибудь возвращать или нет (тогда map должен возвращать вектор возвращаемых типов, либо void).

(Де)мотивирующий пример:

void out(int x) { cout << x << endl; }
void outidx(int x, int idx) { cout << "[" << idx << "] = " << x << endl; }
double inch(int x) { return x * 2.54; }

int main()
{
    using ultra::map;
    vector<int> a; a.push_back(2); a.push_back(3); a.push_back(4);
    map(a, [] (int x) { out(x); });
    map(a, [] (int x, int idx) { outidx(x, idx); });
    map(a, out);
    map(a, outidx);
    vector<double> r1 = map(a, inch);
    vector<double> r2 = map(a, [] (int x) { return inch(x); });
    vector<double> r3 = map(a, inch);
    auto res = map(a, [&a] (int x, int idx) -> double { return a[2] * x + idx; });
}

По поводу реализации такого ultra::map:
udpn: у тебя нет в запасе какого-нибудь способа развидеть?

Collapse )