如何从同一个类的另一个成员函数调用仿函数?

时间:2017-01-09 04:04:54

标签: c++ operator-overloading functor

我已经重载了()运算符来为我做比较,我想把它作为比较器发送到std sort函数调用的第三个参数。现在,此调用位于另一个名为threeSum的成员函数中。我发现发送Solution()有效但this()无法正常工作。这有什么语法规则?

class Solution 
{
public:    
    bool operator() (int i, int j)
    {
        return (i < j);
    }

    vector<vector<int> > threeSum(vector<int> & nums) 
    {
        sort(nums.begin(), nums.end(), this());

        vector<vector<int> > ret_vec;
        ...
        return ret_vec;
    }
};

谢谢。

2 个答案:

答案 0 :(得分:1)

{ "name": "cordova-plugin-splashscreen", "version": "4.0.0", "description": "Cordova Splashscreen Plugin", "cordova": { "id": "cordova-plugin-splashscreen", "platforms": [ "android", "amazon-fireos", "ubuntu", "ios", "blackberry10", "wp8", "windows8", "windows", "tizen" ] }, 不起作用的原因是因为this()是一个指针。你需要先取消引用它。

this

在你的情况下,你应该这样写:

(*this)(args);

或者,如果你想更明确:

sort(nums.begin(), nums.end(), (*this));

答案 1 :(得分:1)

非静态成员函数(包括任何函子)需要包含对象的地址作为其隐式参数。你可以使用lambda函数来实现这个效果:

vector<vector<int> > threeSum(vector<int> & nums) 
{
  auto mysort = [this](int i, int j) {
    return operator()(i, j); 
  };
  sort(nums.begin(), nums.end(), mysort);
  ...
}

这里lambda函数mysort捕获包含对象(this)的运行时地址,并将其用作operator()的隐式参数,现在可以由std::sort使用{1}}。

编辑:此方法不仅适用于仿函数,也适用于其他成员函数。但是如果你只想使用仿函数进行排序,那么直接提供(*this)作为sort的第三个参数的另一个答案可能会稍微提高效率。