У меня есть класс функторов с внутренним состоянием, фиксированным типом вывода и фиксированными параметрами, необходимыми для построения объекта:
class Functor
{
public:
/* constructor */
Functor(double var1, double var2 ...)
{
/* some initialization of internal variables */
}
array<double,N> operator()(double par1, ...)
{
array<double,N> output;
/* some calculations using private member functions */
return output;
}
private:
/* internal variables */
double internal_var1;
...
/* internal functions */
double internal func1(double var1, ...)
{
/* calculation */
}
...
};
Этот функтор создается в основной программе с использованием входных параметров пользователя.Я хочу использовать этот функтор внутри функций-членов других классов, которые также являются функторами, для дальнейших вычислений.Один важный аспект, специфичный для этого вопроса, состоит в том, что эти функторы используют определенную сигнатуру, которую я не могу изменить, иначе я бы просто предоставил этим функторам результат начального функтора (т. Е. Класса Functor
) в качестве входных параметров при вызовеих.
До сих пор моя идея (которая быстро оказалась бессмысленной) заключалась в том, чтобы эти классы имели член, который является указателем на класс вышеупомянутого функтора, и предоставили конструктору этих классов ссылку нафунктор:
class C1
{
public:
/* constructor */
C1(/* some parameters */, Functor* functor) // this is probably nonsense
{
/* C1 member initialization */
...
functor_ptr = functor;
}
void operator()(/* !!! fixed parameter signature here !!! */)
{
/* calulations using internal functions... */
}
private:
/* member variables and the functor class pointer*/
double internal_var1;
... etc. ...
Functor* functor_ptr;
/* member functions */
double internal_func1(double par1, ...)
{
/* use the functor */
double<array,N> tmp = (*functor_ptr)(par1, par2, ...) // more nonsense
/* more calculations */
return result;
}
double internal_func2(...)
... etc. ...
};
Из того, что я до сих пор смотрел, кажется, что использование вызова std:function
внутри C1
может достичь того, что я пытаюсь сделать (и я могу использовать c ++ 11). Этот пост кажется очень похожим на то, что я хочу, однако я не могу понять, как присоединить мой функтор к вызову std::function
, так как мой C (ung) -fu все еще довольно слабый.Также я не мог понять, возможно ли иметь что-то вроде std:function<array<double,N>(double,double,...> call_functor
в качестве члена класса, который инициализируется в конструкторе.
Можно, и если да, то как это сделать, используя std::function
или есть лучший способ?