Weiterleiten von Argumenten an die Template-Member-Funktion

ideone example

Ich muss einige vordefinierte Argumente und einige vom Benutzer übergebene Argumente an eine Mitgliedsfunktion weiterleiten.

#define FWD(xs) ::std::forward<decltype(xs)>(xs)

template<class T, class... Ts, class... TArgs>
void forwarder(void(T::*fptr)(Ts...), TArgs&&... xs)
{
    T instance;
    (instance.*fptr)(FWD(xs)..., 0);
    //                           ^
    // example predefined argument
}

forwarder(&example::f0, 10, 'a');   
forwarder(&example::f1, 10, "hello", 5);

Dies funktioniert ordnungsgemäß für Memberfunktionen, die keine Vorlagen sind.

Der Member-Funktionszeiger, der an @ übergeben wurforwarder kann jedoch auch auf Template-Funktionen verweisen. Leider kann der Compiler den Typ von @ nicht ableitT In diesem Fall

struct example
{
    void f0(int, int) { }

    template<class T>
    void f1(T&&, int) { }
};

// Compiles
forwarder(&example::f0, 10);

// Does not compile
forwarder(&example::f1, 10);

Errors:

prog.cpp:30:28: error: no matching function for call to 'forwarder(<unresolved overloaded function type>, int)'
  forwarder(&example::f1, 10);
                            ^
prog.cpp:20:6: note: candidate: template<class T, class ... Ts, class ... TArgs> void forwarder(void (T::*)(Ts ...), TArgs&& ...)
 void forwarder(void(T::*fptr)(Ts...), TArgs&&... xs)
      ^
prog.cpp:20:6: note:   template argument deduction/substitution failed:
prog.cpp:30:28: note:   couldn't deduce template parameter 'T'
  forwarder(&example::f1, 10);

Ist da eine Möglichkeit, dem Compiler zu helfen, die richtigen Typen zu ermitteln?ohne die Schnittstelle von @ zu ändeforwarder?

Wenn nicht, wie lässt sich dieses Problem am besten lösen, ohne dass die Benutzersyntax zu kompliziert wird?

BEARBEITEN Es ist auch akzeptabel, den Zeiger der Elementfunktion als Vorlagenparameter zu übergeben, z. B. über einen Wrapper. Die Zielelementfunktion ist zur Kompilierungszeit immer bekannt. Pseudocode:

forwarder<WRAP<example::f0>>(10, 'a');
// Where WRAP can be a macro or a type alias.

ideone example

Antworten auf die Frage(2)

Ihre Antwort auf die Frage