fgh.vbn.rty@gmail.com wrote:
Quote:
I'm having problems setting up the functors to use for_each. Here's an
example:
>
class A {
public:
void getName() { return name; }
error: return-statement with a value, in function returning 'void'
Quote:
private:
string name;
};
>
class B {
public:
vector<intgetIds { return vi; }
error: invalid member function declaration
Quote:
A& getA(int idx) { return vA.at(idx); }
void bfunc();
private:
vector<AvA;
vector<intvi;
}
error: missing semi-colon
Quote:
class C {
public:
void cfunc();
private:
B b;
}
error: missing semi-colon
Quote:
void B::bfunc()
{
// populate vi
for(int i=0; i<vi.size(); ++i) {
cout << vA[i].printName() << endl;
error: 'class A' has no member named 'printName'
Quote:
}
}
>
void C::cfunc()
{
// populate vi
vector<intvc = b.getIds();
for(int i=0; i<vc.size(); ++i) {
A& a = getA(vc[i]);
error: 'getA' was not declared in this scope
Quote:
cout << a.getName() << endl;
}
}
>
Here vA is just a vector of As and vi is a vector of integers that
index into vA.
Frankly, there a so many errors, that I don't think the loops do what
you want them to do, especially bfunc.
Quote:
Let's suppose that vA and vi are populated
appropriately. All I'm trying to do is to execute a particular
function on a subset of the As.
>
I have three questions:
1) How do I replace the for loop in bfunc with a for_each?
Don't use for_each, use transform instead:
transform(vA.begin(), vA.begin() + vi.size(),
ostream_iterator<string>(cout, "\n"), mem_fun_ref(&A::getName));
But again, I don't think that's what you want.
Quote:
2) How do I replace the for loop in cfunc with a for_each?
That function really should be in class B. It pulls B's vi variable out,
and then iterates over B's vA variable. So let's put it there instead:
string B::getNameOf(int x)
{
return vA.at(x).getName();
}
void B::cfunc()
{
transform(vi.begin(), vi.end(), ostream_iterator<string>(cout, "\n"),
bind1st(mem_fun(&B::getNameOf), this));
}
Quote:
3) How would I do this using the Boost.Lambda functions?
Differently.