00001 #ifndef PhysicsTools_Utilities_Product_h 00002 #define PhysicsTools_Utilities_Product_h 00003 #include <boost/static_assert.hpp> 00004 00005 namespace funct { 00006 template<typename A, typename B> 00007 struct ProductStruct { 00008 ProductStruct(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(x) * _2(x); 00017 } 00018 double operator()(double x, double y) const { 00019 return _1(x, y) * _2(x, y); 00020 } 00021 A _1; 00022 B _2; 00023 }; 00024 00025 template<typename A, typename B> 00026 struct Product { 00027 typedef ProductStruct<A, B> type; 00028 static type combine(const A& a, const B& b) { 00029 return type(a, b); 00030 } 00031 }; 00032 00033 template<typename A, typename B> 00034 inline typename Product<A, B>::type operator*(const A& a, const B& b) { 00035 return Product<A, B>::combine(a, b); 00036 } 00037 } 00038 00039 #endif