c ++ 11 for_each with lambda作为成员函数

时间:2017-09-26 06:03:24

标签: c++11

在for_each循环中使用带有成员函数的lambda时,我遇到了编译错误。请参考以下代码段以供参考。

void CCommConfig::AddAllowedIP(const string& strIp)
{
if (!strIp.empty())
m_allowedIpsList.push_back(strIp);
}
void CCommConfig::AddAllowedIpList(STRING_LIST &lstIps)
{
std::for_each(begin(lstIps), end(lstIps), this->AddAllowedIP);
}

错误列为

  

1> ........ \ Source \ Lib \ cci \ src \ CommConfig.cpp(70):错误C3867:   ' CCommConfig :: AddAllowedIP&#39 ;:非标准语法;使用'&'创造一个   指向成员1的指针> ........ \ Source \ Lib \ cci \ src \ CommConfig.cpp(70):   错误C2672:' std :: for_each':找不到匹配的重载函数

1 个答案:

答案 0 :(得分:4)

您无法使用this->AddAllowedIP获取函数对象以CCommConfig::AddAllowedIP调用this,这是不允许的。您可以通过&CCommConfig::AddAllowedIP获取指向该函数的指针,但这对您没有帮助,因为它需要CCommConfig来调用它。

你应该创建一个lambda:

[this](const string& ip){ this->AddAllowedIP(ip); }

或者你可以使用std::bind(虽然它已经失宠了):

std::bind(&CCommConfig::AddAllowedIP, this, std::placeholders::_1)

两者都会创建一个功能对象,代表您AddAllowedIP正确调用this,以便将其传递给for_each

编辑再次查看它,你可能会更好地使用循环:

for (const string& ip : lstIps)
  AddAllowedIP(ip);