Wie kombiniere ich std :: bind (), verschiedene Templates und perfekte Weiterleitungen?

Ich möchte eine Methode über eine Drittanbieterfunktion von einer anderen aufrufen. Beide verwenden jedoch unterschiedliche Vorlagen. Zum Beispiel:

void third_party(int n, std::function<void(int)> f)
{
  f(n);
}

struct foo
{
  template <typename... Args>
  void invoke(int n, Args&&... args)
  {
    auto bound = std::bind(&foo::invoke_impl<Args...>, this,
                           std::placeholders::_1, std::forward<Args>(args)...);

    third_party(n, bound);
  }

  template <typename... Args>
  void invoke_impl(int, Args&&...)
  {
  }
};

foo f;
f.invoke(1, 2);

Das Problem ist, ich bekomme einen Kompilierungsfehler:

/usr/include/c++/4.7/functional:1206:35: error: cannot bind ‘int’ lvalue to ‘int&&’

Ich habe versucht, ein Lambda zu verwenden, aberkönnte sein GCC 4.8 behandelt die Syntax noch nicht. Folgendes habe ich versucht:

auto bound = [this, &args...] (int k) { invoke_impl(k, std::foward<Args>(args)...); };

Ich erhalte folgenden Fehler:

error: expected ‘,’ before ‘...’ token
error: expected identifier before ‘...’ token
error: parameter packs not expanded with ‘...’:
note:         ‘args’

Soweit ich weiß, möchte der Compiler instanziiereninvoke_impl mit typint&&, während ich das mit dachte&& in diesem Fall würde der tatsächliche Argumenttyp beibehalten.

Was mache ich falsch? Vielen Dank,

Antworten auf die Frage(1)

Ihre Antwort auf die Frage