Использование функтора внутри функций-членов другого класса - PullRequest
0 голосов
/ 19 ноября 2018

У меня есть класс функторов с внутренним состоянием, фиксированным типом вывода и фиксированными параметрами, необходимыми для построения объекта:

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 или есть лучший способ?

1 Ответ

0 голосов
/ 19 ноября 2018

Действительно, верните функцию с std:function<array<double,N>(double,double,...)>, и для ее создания используйте лямбду:

std:function<array<double,N>(double,double,...)>([this](double x, double y, ...){return this->function(x, y,);};

Вам нужно захватить this, конечно, чтобы узнать, на каком объекте должен вызываться метод.

...