Eri*_*ein 2 foreach for-loop class c++11
我的问题是:如何将类成员函数传递给for_each
代码我试图开始工作:(当函数在类外定义时工作)
失败的部分被注释掉 - 使用带有函数的for_each作为类成员函数
有关如何使其工作的任何建议?
#include <iostream>
#include <algorithm>
#include <vector>
void my_function(std::string str)
{
std::cout << "processing settings: " << str << std::endl;
}
class Settings_vector{
public:
std::vector <std::string> settings;
Settings_vector(){ // push back vector of objects
settings.push_back("settings 1");
settings.push_back("settings 2");
settings.push_back("settings 3");
settings.push_back("settings 4");
}
void tester(std::string settings_string){
std::cout << "processing settings: " << settings_string << std::endl;
}
};
int main()
{
//std::vector<std::string> my_vector;
Settings_vector settings_vector;
std:: cout << "doing things the non-class way\n" << std::endl;
for_each(settings_vector.settings.begin(), settings_vector.settings.end(), my_function); // testing function
// WORKS
/*
std:: cout << "doing things the modern way\n" << std::endl;
for_each(settings_vector.settings.begin(), settings_vector.settings.end(), settings_vector.tester); // testing function
// FAILS
*/
std:: cout << "doing things the oldskool way\n" << std::endl;
for (int i = 0;i<settings_vector.settings.size();++i) {
settings_vector.tester(settings_vector.settings[i]);
}
// WORKS
return 0;
}
Run Code Online (Sandbox Code Playgroud)
最简单的方法是使用lambda表达式.复杂一点的方法是使用std::bind()绑定所有已知的参数(这里的类成员函数的实例),并将未知参数占位符_1,_2等等.
#include <iostream>
#include <algorithm>
#include <vector>
class Settings_vector
{
Settings_vector()
: settings { "settings 1"
, "settings 2"
, "settings 3"
, "settings 4"
}
{}
void tester(std::string settings_string)
{ std::cout << "processing settings: " << settings_string << std::endl; }
public:
std::vector <std::string> settings;
};
int main()
{
Settings_vector settings_vector;
using namespace std;
using namespace std::placeholders; // for _1
// Possibility Nr. 1: Use a Lambda Function
for_each( settings_vector.settings.begin(), settings_vector.settings.end()
, [&settings_vector](auto input){ settings_vector.tester(input); }
)
;
// Possibility Nr. 2: Partially bind existing arguments and use placeholders for others
for_each( settings_vector.settings.begin(), settings_vector.settings.end()
, std::bind(&Settings_vector::tester, &settings_vector, _1);
)
;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
说明:
我认为lambda是直截了当的.在方括号中,您声明了什么进入闭包.我们在这里通过settings_vector.在它之前&表示此实例通过引用传递.在括号中,我们声明函数的参数.我作弊了一点,因为auto在C++ 14中引入了lambda表达式,但你也可以把它写成类型std::string.
std::bind()将参数绑定到函数指针并返回可调用对象.如果存在所有参数,则返回的callable没有参数,可以调用如下:callable().在这里,我们希望callable接受迭代的结果.因此,我们使用占位符_1,该占位符表明此参数将在调用时更改.现在剩下两件事:
获取指向成员函数的指针.&TypeName::MemberName在这种情况下,这是通过使用来完成的&Settings_vector::tester.
将this指针传递给成员函数调用:&settings_vector.调用成员函数时,必须传递一个对象,该对象必须为其调用此成员函数.因为我们只有一个指向成员函数的指针而没有任何绑定对象,所以这就是第二个参数的原因&settings_vector.
| 归档时间: |
|
| 查看次数: |
459 次 |
| 最近记录: |