Suppose I have some ref counted class Foo with the private member mBar.
Normally with a lambda expression, you can easily access the private
members by passing the this pointer:

void Foo::pokeBar()
{
  nsCOMPtr<nsIRunnable> r = NS_NewRunnableFunction[this] () -> void
  {
    mBar.poke();
  });
  NS_DispatchToMainThread(r);
}

But obviously the Foo object could get released before the dispatch
completes. I could capture an nsRefPtr to this in the lambda:

nsresult Foo::pokeBar()
{
  nsRefPtr<Foo> self = this;
  nsCOMPtr<nsIRunnable> r = NS_NewRunnableFunction[self] () -> void
  {
    self->mBar.poke();
  });
  NS_DispatchToMainThread(r);
}

But now it won't let me access the private members. I can add *both* and it
appears to work (at least on gcc, haven't tested clang/msvc):

nsresult Foo::pokeBar()
{
  nsRefPtr<Foo> self = this;
  nsCOMPtr<nsIRunnable> r = NS_NewRunnableFunction[this, self] () -> void
  {
    self->mBar.poke();
  });
  NS_DispatchToMainThread(r);
}

Since I'm using the self pointer, I don't see the compiler optimizing the
capture of it out, and the addition of "this" opens up the scope to what I
need. (Although maybe explicitly using self is overkill? Can I eliminate
that safely?)

But this is my first time using lambda expressions in C++, so I'm not
entirely sure if there is a good reason for *not* doing what I am above :).
In the few examples of lambdas that I found in our code, it looks like we
just made everything public. My other attempts at fixing this was to make
an nsRefPtr to mBar inside Foo::pokeBar and pass *that* to the lambda,
which is fine but my real world uses have multiple private members and
functions I would like to access :). Is there anybody who can chime in on
how best to use lamdas with private members?

The only guidance I could find on the wiki was this, which I think I am
following (e.g. don't use [=] to suck down everything):
https://developer.mozilla.org/en-US/docs/Mozilla/C++_Portability_Guide#Use_C.2B.2B_lambdas.2C_but_with_care

Thanks,


Andrew
_______________________________________________
dev-platform mailing list
dev-platform@lists.mozilla.org
https://lists.mozilla.org/listinfo/dev-platform

Reply via email to