0

我正在查看从另一个 SO 帖子中获得的以下示例。示例是这样的

class checker 
{ 
public:  
    bool operator()(unsigned int i)  
    { 
     if (i%2 == 0)
     {
         return true;   --------------->Statement A
     }
     return false;

    }  
}; 

    std::vector<int> vec;
    vec.push_back(3);
    vec.push_back(5);
    vec.push_back(2);
    if(std::find_if(vec.begin(), vec.end(), checker()) != vec.end())
    {
        std::cout << "Found";
    }

现在我对上面的例子有三个问题:

Q1- find_if 的第三个参数接受一个 predicate 。这里我使用的是仿函数对象。该谓词假设是指针(地址)还是对象。在这里,我传递了一个对象,但是在这个示例中,它在msdn上传递了一个地址。我意识到在那个例子中谓词不是一个类的成员方法。但是,如果有人可以在这里澄清谓词参数的要求,我仍然会很感激。因为如果它可以接受函数指针,那么这不起作用

bool (checker::*aptr)(unsigned int) = NULL;  //Function ptr of class method
aptr = &(checker::operator());
    if(std::find_if(vec.begin(), vec.end(), aptr) != vec.end()){...};

Q2-尽管上面的示例工作正常,但是当我在语句 A 处设置断点时,断点永远不会被命中,并且假设它返回 true。澄清这一点会有所帮助。

Q3-一些例子从std::unary_function<key_struct, bool>What is the reason for that中派生了struct /class。上面的课程对我来说效果很好。为什么需要从中派生它std::unary_function<key_struct, bool>

4

1 回答 1

1
  1. 谓词参数可以是任何可以调用的东西,例如带有相应参数的函数并返回可转换为的东西bool。它可以是函数对象,即具有函数调用运算符的类的对象,也可以是函数指针。如果你不修改你的对象,你可能应该让函数调用 operator const
  2. 猜想函数运算符最终会被内联,并且您将断点放入函数对象的离线版本中。使用内联函数设置断点可能很棘手。您可能想尝试使函数非内联以进行测试。出于生产目的,您希望创建大多数谓词inline,因为存在巨大的性能差异。
  3. 当使用函数对象适配器时,例如,std::not1()对于函数对象,它们需要定义某些嵌套类型。对于普通函数,可以很容易地推导出相应的关联类型,例如返回类型和参数类型。对于函数对象,它们不能在 C++03 中推导出来。在 C++11 中,所有嵌套类型都不是必需的(如果我没记错的话)。在任何情况下,std::find_if()除了调用它之外,不需要弄乱函数对象,即实际上不需要任何嵌套类型。

顺便说一句,您的谓词是否有任何理由不只返回表达式的结果?也就是说,我会这样实现它:

struct checker {
    bool operator()(unsigned int i) const { return (i % 2) == 0; }
};
于 2013-09-09T00:35:24.840 回答