00001 #ifndef PhysicsTools_Utilities_Sum_h 00002 #define PhysicsTools_Utilities_Sum_h 00003 #include "PhysicsTools/Utilities/interface/Numerical.h" 00004 #include <boost/static_assert.hpp> 00005 00006 namespace funct { 00007 template<typename A, typename B> 00008 struct SumStruct { 00009 SumStruct(const A & a, const B & b) : _1(a), _2(b) { } 00010 double operator()() const { 00011 return _1() + _2(); 00012 } 00013 operator double() const { 00014 return _1() + _2(); 00015 } 00016 double operator()(double x) const { 00017 return _1(x) + _2(x); 00018 } 00019 double operator()(double x, double y) const { 00020 return _1(x, y) + _2(x, y); 00021 } 00022 A _1; 00023 B _2; 00024 }; 00025 00026 template<typename A, typename B> 00027 struct Sum { 00028 typedef SumStruct<A, B> type; 00029 static type combine(const A& a, const B& b) { return type(a, b); } 00030 }; 00031 00032 template<typename A, typename B> 00033 inline typename Sum<A, B>::type operator+(const A& a, const B& b) { 00034 return Sum<A, B>::combine(a, b); 00035 } 00036 00037 } 00038 00039 #endif