Vous pouvez donner à la « autre » fonction à la première fonction de rappeler sur:
#include <algorithm>
#include <iostream>
template<typename It, typename It2, typename F1, typename F2>
void combine(It from, It to, It2 out, F1 f1, F2 f2) {
for(int* p = from; p != to; ++p) {
*(out++) = f2(f1(*p));
}
}
int increment(int i){ return ++i; }
int twice(int i){ return i+i; }
int main() {
int ints[]={1,2,3,4};
int result[4];
combine(ints, ints+4, result, increment, twice);
std::copy(result, result+4, std::ostream_iterator<int>(std::cout, "; "));
}
En fait, ce mécanisme peut être étendu en versant les fonctions dans des objets de «première classe». La STL a des constructions pour y parvenir: si vous enveloppez vos fonctions libres dans un objet ptr_fun
, vous pouvez construire un meilleur foncteur de combinaison. Dans l'implémentation STL de SGI, la fonction compose
est disponible.
#include <functional>
template<typename F1, typename F2>
struct Combined : public std::unary_function
< typename F1::argument_type
, typename F2::result_type > {
typedef typename F2::result_type result_type;
typedef typename F1::argument_type argument_type;
Combined(F1 f1, F2 f2): f1_(f1), f2_(f2) {}
result_type operator()(argument_type arg) const {
return f2_(f1_(arg));
}
private:
F1 f1_;
F2 f2_;
};
template<typename F1, typename F2>
Combined<F1,F2> combined(F1 f1, F2 f2) { return Combined<F1,F2>(f1,f2); }
Et puis utiliser cette fonctionnalité pour combiner des fonctions encore plus génériquement:
#include <iostream>
#include <iterator>
#include <algorithm>
int increment(int i){ return ++i; }
int twice(int i) { return 2*i; }
int main() {
using namespace std;
int values[]={1,2,3,4};
transform(values, values+4, ostream_iterator<int>(cout, "; "),
combined(ptr_fun(increment), ptr_fun(twice))
);
transform(values, values+4, ostream_iterator<int>(cout, "; "),
combined(ptr_fun(increment),
combined(ptr_fun(increment), ptr_fun(twice)))
);
}
Que signifie o/p? – fredoverflow
sortie probablement – ChrisBD
Ma conjecture est: "sortie"? – Goz