46 namespace QQbar_threshold{
59 double value(
double thr)
const{
60 return static_cast<E
const *
>(
this)->value(thr);
67 return static_cast<E&
>(*this);
70 operator E
const &()
const{
71 return static_cast<E
const &
>(*this);
80 template<
typename E1,
typename E2>
81 class difference:
public expression<difference<E1,E2>>{
82 std::shared_ptr<E1> x;
83 std::shared_ptr<E2> y;
85 difference(expression<E1>
const & e1, expression<E2>
const & e2)
86 : x(std::make_shared<E1>(e1)), y(std::make_shared<E2>(e2)) {}
88 double value(
double thr)
const{
89 return x->value(thr) - y->value(thr);
96 template<
typename E1,
typename E2>
97 class sum:
public expression<sum<E1,E2>>{
98 std::shared_ptr<E1> x;
99 std::shared_ptr<E2> y;
101 sum(expression<E1>
const & e1, expression<E2>
const & e2)
102 : x(std::make_shared<E1>(e1)), y(std::make_shared<E2>(e2)) {}
104 double value(
double thr)
const{
105 return x->value(thr) + y->value(thr);
112 template<
typename E1,
typename E2>
113 class product:
public expression<product<E1,E2>>{
114 std::shared_ptr<E1> x;
115 std::shared_ptr<E2> y;
117 product(expression<E1>
const & e1, expression<E2>
const & e2)
118 : x(std::make_shared<E1>(e1)), y(std::make_shared<E2>(e2)) {}
120 double value(
double thr)
const{
121 return x->value(thr) * y->value(thr);
128 template<
typename E1,
typename E2>
129 class ratio:
public expression<ratio<E1,E2>>{
130 std::shared_ptr<E1> x;
131 std::shared_ptr<E2> y;
133 ratio(expression<E1>
const & e1, expression<E2>
const & e2)
134 : x(std::make_shared<E1>(e1)), y(std::make_shared<E2>(e2)) {}
136 double value(
double thr)
const{
137 return x->value(thr) / y->value(thr);
145 class neg:
public expression<neg<E>>{
146 std::shared_ptr<E> x;
148 explicit neg(expression<E>
const &
e): x(std::make_shared<E>(e)) {}
150 double value(
double thr)
const{
151 return -x->value(thr);
159 class double_expr:
public expression<double_expr>{
162 explicit double_expr(
double d): x(d) {}
164 double value(
double)
const{
170 template<
typename E1,
typename E2>
171 sum<E1, E2> operator+(expression<E1>
const & e1, expression<E2>
const & e2){
172 return sum<E1, E2>{e1, e2};
175 template<
typename E1,
typename E2>
176 difference<E1, E2> operator-(expression<E1>
const & e1, expression<E2>
const & e2){
177 return difference<E1, E2>{e1, e2};
180 template<
typename E1,
typename E2>
181 product<E1, E2> operator*(expression<E1>
const & e1, expression<E2>
const & e2){
182 return product<E1, E2>{e1, e2};
185 template<
typename E1,
typename E2>
186 ratio<E1, E2> operator/(expression<E1>
const & e1, expression<E2>
const & e2){
187 return ratio<E1, E2>{e1, e2};
191 neg<E> operator-(expression<E>
const &
e){
195 template<
typename E1>
196 difference<E1, double_expr> operator-(expression<E1>
const & e1,
double x){
197 return e1 - double_expr{x};
200 template<
typename E1>
201 sum<E1, double_expr> operator+(expression<E1>
const & e1,
double x){
202 return e1 + double_expr{x};
205 template<
typename E1>
206 product<E1, double_expr> operator*(expression<E1>
const & e1,
double x){
207 return e1 * double_expr{x};
210 template<
typename E1>
211 ratio<E1, double_expr> operator/(expression<E1>
const & e1,
double x){
212 return e1 / double_expr{x};
215 template<
typename E2>
216 sum<double_expr, E2> operator+(
double x, expression<E2>
const & e2){
217 return double_expr{x} + e2;
220 template<
typename E2>
221 difference<double_expr, E2> operator-(
double x, expression<E2>
const & e2){
222 return double_expr{x} - e2;
225 template<
typename E2>
226 product<double_expr, E2> operator*(
double x, expression<E2>
const & e2){
227 return double_expr{x} * e2;
230 template<
typename E2>
231 ratio<double_expr, E2> operator/(
double x, expression<E2>
const & e2){
232 return double_expr{x} / e2;
255 struct threshold :
public detail::expression<threshold>{
256 double value(
double thr)
const{
Center-of-mass energy of a quark threshold.
Definition: threshold.hpp:255
constexpr double e
Electric charge of the electron in units of the positron charge.
Definition: constants.hpp:68