Как перегрузить оператор для композиции функционалов в C ++ 0x?

Есть ли способ перегрузить, скажем, оператор >> для композиции функций? Оператор должен без проблем работать с лямбдами, а также с std :: function ?

Требования:

  • Решение не должно включать вложенные вызовы bind ,
  • левый операнд может быть функционального типа с произвольным числом параметров, и
  • не должно быть создано более одного экземпляра объекта функции.

Вот быстрый и грязный пример, который иллюстрирует желаемое поведение:

#include <iostream>
#include <functional>

using namespace std;

// An example of a quick and dirty function composition.
// Note that instead of 'std::function' this operator should accept
// any functional/callable type (just like 'bind').
template<typename R1, typename R2, typename... ArgTypes1>
function<R2(ArgTypes1...)> operator >> (
                const function<R1(ArgTypes1...)>& f1,
                const function<R2(R1)>& f2) {
    return [=](ArgTypes1... args){ return f2(f1(args...)); };
}

int main(int argc, char **args) {
    auto l1 = [](int i, int j) {return i + j;};
    auto l2 = [](int i) {return i * i;};

    function<int(int, int)> f1 = l1;
    function<int(int)> f2 = l2;

    cout << "Function composition: " << (f1 >> f2)(3, 5) << endl;

    // The following is desired, but it doesn't compile as it is:
    cout << "Function composition: " << (l1 >> l2)(3, 5) << endl;

    return 0;
}
6
задан sinharaj 29 July 2011 в 07:52
поделиться