Вызовите функцию-член, используя for_each

Это был мой оригинальный код

#include "stdafx.h"#include <string>
#include <list>
#include <algorithm>
using namespace std;class testing
{
public:
int value;
testing(int v)
{
value = v;
}

int getval()
{
return(value);
}

};

void func(testing& ob)
{
printf("The value is %d\n", ob.value);
}

int _tmain(int argc, _TCHAR* argv[])
{
std::list<testing> testvar[3];

testing t1(0);
testing t2(1);
testing t3(3);

testvar[0].push_back(t1);
testvar[0].push_back(t2);
testvar[0].push_back(t3);

std::for_each(testvar[0].begin(), testvar[0].end(), func);

printf("Reached End");
getchar();
return 0;
}

Я изменил его, чтобы сделать func функцией-членом и получил странные ошибки компиляции, я искал в Интернете, и кто-то сказал использовать bind1st, bind2nd

#include "stdafx.h"#include <string>
#include <list>
#include <algorithm>
using namespace std;

class testing
{
public:
int value;
testing(int v)
{
value = v;
}

int getval()
{
return(value);
}

};

class testing2
{
public:
std::list<testing> testvar[3];

void func(testing& ob)
{
printf("The value is %d\n", ob.value);
}

void driver()
{
std::for_each(testvar[0].begin(), testvar[0].end(), func);
}

};int _tmain(int argc, _TCHAR* argv[])
{
testing2 testob;

testob.driver();printf("Reached End");
getchar();
return 0;
}

Поэтому я изменил функцию драйвера для этого

    void driver()
{
std::for_each(testvar[0].begin(), testvar[0].end(),     std::bind1st(std::mem_fun(&testing2::func), this));
}

Я все еще получаю какие-то странные ошибки компиляции, может кто-нибудь объяснить, почему мы должны вызывать функцию-член, это такой странный способ? и как bind1st помогает ..?

2

Решение

Используйте std :: bind

 std::for_each(testvar[0].begin(), testvar[0].end(), std::bind(&testing2::func, this, std::placeholders::_1));

Или используйте std :: bind / lambdas

 std::for_each(testvar[0].begin(), testvar[0].end(), [this](testing& ob) { func(ob); });

Полный:

#include <string>
#include <list>
#include <algorithm>
using namespace std;

struct testing {
int value;
testing(int v) { value = v; }
int getval() { return(value); }
};

struct testing2 {
std::list<testing> testvar[3];

void func(testing& ob) {
printf("The value is %d\n", ob.value);
}

void driver() {
auto f = std::bind(&testing2::func, this, std::placeholders::_1);
std::for_each(testvar[0].begin(), testvar[0].end(), f);
std::for_each(testvar[0].begin(), testvar[0].end(), [this](testing& ob) { func(ob); });
}
};

int main() {
testing2 testob;
testob.driver();
printf("Reached End");
}
6

Другие решения

Так как в этом случае func Кажется, вам не нужно иметь доступ к членам класса, вы можете сделать это статичным, и ваш оригинальный код будет работать.

static void func(testing& ob)
{
printf("The value is %d\n", ob.value);
}
0

По вопросам рекламы [email protected]