在另一个类的成员函数中使用函子

时间:2018-11-19 10:12:40

标签: c++ c++11 functor

我有一个函子类,具有内部状态,固定的输出类型和构造对象所需的固定参数:

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)。 This post似乎与我想要的非常相似,但是,由于C(ung)-fu仍然很弱,我不知道如何将函子附加到std::function调用中。我也不知道是否有可能像std:function<array<double,N>(double,double,...> call_functor这样的东西作为class的成员,而class是在构造函数中初始化的。

可以(如果可以的话)使用std::function完成此操作,还是有更好的方法?

1 个答案:

答案 0 :(得分:0)

实际上,返回带有std:function<array<double,N>(double,double,...)>的函数,并使用lambda创建它:

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

您当然需要捕获this才能知道应在哪个对象上调用该方法。