23#ifndef MODELFITTING_DEPENDENTPARAMETER_H
24#define MODELFITTING_DEPENDENTPARAMETER_H
47template<
typename... Parameters>
52 static constexpr int PARAM_NO =
sizeof...(Parameters);
64 inputParameterLoop(parameters...);
71 if (!this->isObserved()) {
90 template<
typename First,
typename ...
Rest>
92 addParameterObserver(PARAM_NO -
sizeof...(
rest) - 1,
first);
93 inputParameterLoop(
rest...);
96 template<
typename Last>
98 addParameterObserver(PARAM_NO - 1,
last);
109 update(
values..., (*m_params)[
sizeof...(values)]->getValue());
119 template<
typename Param>
121 param->addObserver([
this](
double){
123 if (this->isObserved()) {
124 this->update((*m_params)[0]->getValue());
130template<
typename ... Parameters>
The parameter base class.
virtual void setValue(const double new_value)
Implementation of a parameter depending on an arbitrary number of other parameters.
double getValue() const override
void update(decltype(std::declval< Parameters >() ->getValue())... values)
void update(ParamValues... values)
void addParameterObserver(int, Param ¶m)
virtual ~DependentParameter()=default
static constexpr int PARAM_NO
std::shared_ptr< std::array< std::shared_ptr< BasicParameter >, PARAM_NO > > m_params
void inputParameterLoop(First &first, Rest &... rest)
DependentParameter(ValueCalculator calculator, Parameters... parameters)
void inputParameterLoop(Last &last)
std::shared_ptr< ValueCalculator > m_calculator
function to calculate the dependent parameter value
std::shared_ptr< DependentParameter< Parameters... > > createDependentParameter(typename DependentParameter< Parameters... >::ValueCalculator value_calculator, Parameters... parameters)