Go to the documentation of this file.00001 #ifndef PhysicsTools_Utilities_Composition_h
00002 #define PhysicsTools_Utilities_Composition_h
00003 #include <boost/static_assert.hpp>
00004
00005 namespace funct {
00006 template<typename A, typename B>
00007 struct CompositionStruct {
00008 CompositionStruct(const A & a, const B & b) : _1(a), _2(b) { }
00009 double operator()() const {
00010 return _1(_2());
00011 }
00012 operator double() const {
00013 return _1(_2());
00014 }
00015 double operator()(double x) const {
00016 return _1(_2(x));
00017 }
00018 double operator()(double x, double y) const {
00019 return _1(_2(x, y));
00020 }
00021 A _1;
00022 B _2;
00023 };
00024
00025 template<typename A, typename B>
00026 struct Composition {
00027 typedef CompositionStruct<A, B> type;
00028 static type compose(const A& a, const B b) { return type(a, b); }
00029 };
00030
00031 template<typename A, typename B>
00032 inline typename funct::Composition<A, B>::type compose(const A& a, const B& b) {
00033 return funct::Composition<A, B>::compose(a, b);
00034 }
00035
00036 }
00037
00038
00039 #endif