在另一个 class 的成员函数中使用仿函数
Using a functor inside member functions of another class
我有一个仿函数 class 具有内部状态和固定输出类型以及构造对象所需的固定参数:
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 */
}
...
};
这个仿函数是在主程序中使用用户的输入参数实例化的。
我想在其他 classes 的成员函数中使用这个仿函数,它们也是仿函数,以进行进一步的计算。这个问题的一个重要方面是,这些仿函数使用我无法更改的特定签名,否则我只会向这些仿函数提供初始仿函数的结果(即 class Functor
) 作为调用它们时的输入参数。
到目前为止我的想法(很快就证明是无稽之谈)是让这些 classes 有一个成员,它是指向上述仿函数的 class 的指针,并提供构造函数其中 class 是对仿函数的引用:
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. ...
};
从我目前所看到的来看,似乎在 C1
中使用 std:function
调用可以实现我正在尝试做的事情(并且我可以使用 c++11)。 This post 看起来与我想要的非常相似,但是,我无法弄清楚如何将我的仿函数附加到 std::function
调用,因为我的 C(ung)-fu 仍然很弱。我也不知道是否有可能像 std:function<array<double,N>(double,double,...> call_functor
这样的东西作为 class 的成员,这是在构造函数中初始化的。
可以,如果可以,如何使用 std::function
或有更好的方法吗?
的确,return 一个带有 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
当然要知道应该在哪个对象上调用该方法。
我有一个仿函数 class 具有内部状态和固定输出类型以及构造对象所需的固定参数:
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 */
}
...
};
这个仿函数是在主程序中使用用户的输入参数实例化的。
我想在其他 classes 的成员函数中使用这个仿函数,它们也是仿函数,以进行进一步的计算。这个问题的一个重要方面是,这些仿函数使用我无法更改的特定签名,否则我只会向这些仿函数提供初始仿函数的结果(即 class Functor
) 作为调用它们时的输入参数。
到目前为止我的想法(很快就证明是无稽之谈)是让这些 classes 有一个成员,它是指向上述仿函数的 class 的指针,并提供构造函数其中 class 是对仿函数的引用:
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. ...
};
从我目前所看到的来看,似乎在 C1
中使用 std:function
调用可以实现我正在尝试做的事情(并且我可以使用 c++11)。 This post 看起来与我想要的非常相似,但是,我无法弄清楚如何将我的仿函数附加到 std::function
调用,因为我的 C(ung)-fu 仍然很弱。我也不知道是否有可能像 std:function<array<double,N>(double,double,...> call_functor
这样的东西作为 class 的成员,这是在构造函数中初始化的。
可以,如果可以,如何使用 std::function
或有更好的方法吗?
的确,return 一个带有 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
当然要知道应该在哪个对象上调用该方法。