friend void todo(); // not working
Yes, it's not working. This declares that the friend function is some function called "todo".
This is not the same thing as a class member of the same name. Friends are functions (or classes), and not class members.
The fundamental issue you are facing here is a combination of two fundamental C++ aspects:
std::function<something> is a concrete, discrete class of its own.
Each lambda is an anonymous class, and all lambda are discrete, different anonymous classes.
You could declare something like:
friend class std::function<void(A* obj)>;
But that's not going to accomplish anything productive. This will allow the std::function template itself to access private members of this class. So, if something in the internal implementation of your C++ library's std::function template needs to access a private class member, it can now do that. But, of course, there's nothing in std::function itself that has any awareness of your class.
And since each lambda itself is a discrete anonymous class, this has no effect on any lambda. std::function itself is a concrete class of its own, which effects type erasure, for these anonymous lambdas.
In short, this cannot be done in C++. What you are really want to have is make a specific anonymous lambda class a friend of this class. But there is no such syntax in C++. You must come up with some other alternate strategy of giving your lambdas access to your class's private members.