Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 通过引用传递函数对象可以吗?_C++ - Fatal编程技术网

C++ 通过引用传递函数对象可以吗?

C++ 通过引用传递函数对象可以吗?,c++,C++,我有一段代码需要传递一个函数对象(functional)。我不能使用函数指针,因为我需要存储一些状态变量。假设我有很多状态变量。通过引用传递函数对象可以吗?我只见过按值传递的函数对象。这就是我的代码的样子: struct FunctionObject { double a, b, x, y; double operator() (int v, int w) {....} }; template <class T> Class MyClass { T&

我有一段代码需要传递一个函数对象(functional)。我不能使用函数指针,因为我需要存储一些状态变量。假设我有很多状态变量。通过引用传递函数对象可以吗?我只见过按值传递的函数对象。这就是我的代码的样子:

struct FunctionObject {
    double a, b, x, y;
    double operator() (int v, int w) {....}
};

template <class T>
Class MyClass {
     T& func;
     .....
public:
     MyClass(T& func):func(func) {}
     .....
};
struct FunctionObject{
双a,b,x,y;
双运算符()
};
模板
类MyClass{
T&func;
.....
公众:
MyClass(T&func):func(func){}
.....
};

< /代码> 通过引用传递函数对象是很好的,但是您应该知道许多C++算法复制函数对象,因此如果需要一个库算法来尊重您的状态,则应该将其作为函数对象内的引用传递:

struct State {
    double a, b, x, y;
};
struct Function {
    State &state;
    explicit Function(State &state): state(state) {}
    double operator() (int v, int w) {....}
};
State state;
std::...(..., Function(state), ...)

此外,一些库算法(例如)要求C++11之前的函数对象没有任何副作用,即没有任何状态;这个要求很少被强制执行,在C++11中被放宽了。

synthax是正确的,但是

  • 大多数情况下,您将在稍后的代码中调用函数对象,因此您需要确保在MyClass中提供的引用仍在范围内
  • 因此,由于最终需要将函数对象保留在堆中而不是堆栈中,因此必须创建指向它的指针。。。所以我建议使用指针

函数对象是对象。您可以通过引用传递它们,也可以根据通常的生存期问题存储对它们的引用。但是,
std::
中的算法允许随时复制其函数对象,因此任何存储状态都可能过时,因此最好将函数对象作为指针或其状态引用的包装来编写。

这主要取决于您打算如何实例化FunctionObject(如何创建函数对象)。如果使用引用,则必须确保函数对象比用户(MyClass)对象寿命长

例如:

MyClass* createObject() {
    MyFunction f(...);         // function object created
    return new MyClass(f);     // reference used
                               // function object destroyed => reference invalid
}
不正确,因为返回的对象具有对已销毁(无效)函数的引用


由于通过引用传递(避免复制一个小对象)所获得的收益很少,因此不值得费事(检查对象的生命周期)和疏忽风险(bug)

是的,这很好。只是要小心,函数对象的生存期超过了引用它的生存期。当然,这个建议不是函数对象独有的。