gpt4 book ai didi

c++ - 在实例方法中使用 find_if

转载 作者:太空狗 更新时间:2023-10-29 20:16:11 25 4
gpt4 key购买 nike

我有一个填充字符串 vector 的实例方法。我试图找到包含特定子字符串的一个 vector 条目(目前,该子字符串是固定的 - 简单)。

我有一个.h:

namespace Data
{
namespace Shared
{

class Logger
{
public:
bool FindLogDirectoryPredicate(const string &str);
int GetLogDirectory(string logConfigFile, string& logDirectory);
...
}
}
}

.cpp:

#include <algorithm>
#include <vector>
#include "Logger.h"

bool Logger::FindLogDirectoryPredicate(const string &str)
{
// Return false if string found.
return str.find("File=") > 0 ? false : true;
}

int Logger::GetLogDirectory(string logConfigFile, string& logDirectory)
{
vector<string> fileContents;
...
vector<string>::iterator result = find_if(fileContents.begin(), fileContents.end(), FindLogDirectoryPredicate);
...
}

在 Visual Studio 2010 中编译它,我收到:

Error   7   error C3867: 'Data::Shared::Logger::FindLogDirectoryPredicate': function call missing argument list; use '&Data::Shared::Logger::FindLogDirectoryPredicate' to create a pointer to member   Logger.cpp  317 1   Portability

然后在 find_if 调用中的函数 ref 前面加上 & 会导致:

Error   7   error C2276: '&' : illegal operation on bound member function expression    Logger.cpp  317 1   Portability

我确实尝试将谓词函数放在类之外,但这似乎不起作用 - 给我一个函数未找到错误。尝试用类名限定谓词......这给了我一个不同的算法错误(标题):

Error   1   error C2064: term does not evaluate to a function taking 1 arguments    c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\algorithm    83  1   Portability

我在 here 中关注的示例似乎表明这相对简单....那么我做错了什么?

最佳答案

问题是 FindLogDirectoryPredicate是一个实例 方法:指定它的名称是不够的,您必须以某种方式指定哪个对象 应该调用该方法。现在这个问题的答案对我们来说是显而易见的 ( this ),但对编译器来说却不是。

经典的方法是使用

find_if(fileContents.begin(), 
fileContents.end(),
bind1st(mem_fun(&Logger::FindLogDirectoryPredicate), this));

这是怎么回事?

mem_fun “将成员函数转换为函数对象”。也就是说,它创建了一个类型的实例(究竟是什么类型未指定,但我们不关心)公开了 operator() (这是我们真正关心的!)。该运算符期望第一个参数是指向定义成员函数的类型的实例的指针;在这里,这将是 Logger 的一个实例.

bind1st 然后接受这个带有两个参数的函数对象(第一个是指向实例的指针,第二个是原始的 const string & 参数)并返回一个只接受一个参数(const string &)的不同函数对象。另一个参数固定为 bind1st 的值的第二个参数(this)。

或者,如果你能做到 FindLogDirectoryPredicate static然后不再需要指定调用它的实例,因此问题将自动消失。

关于c++ - 在实例方法中使用 find_if,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10281809/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com