Sind zwei oder mehr Beispielfunktionen gegeben, ist es möglich, einen Templates-Code zu schreiben, der in der Lage wäre, die Argumente einer als Template-Parameter bereitgestellten Funktion abzuleiten?Wie man Argumentliste vom Funktionszeiger ableitet?
Dies ist das motivierende Beispiel:
void do_something(int value, double amount) {
std::cout << (value * amount) << std::endl;
}
void do_something_else(std::string const& first, double & second, int third) {
for(char c : first)
if(third/c == 0)
second += 13.7;
}
template<void(*Func)(/*???*/)>
struct wrapper {
using Args = /*???*/;
void operator()(Args&& ... args) const {
Func(std::forward<Args>(args)...);
}
};
int main() {
wrapper<do_something> obj; //Should be able to deduce Args to be [int, double]
obj(5, 17.4); //Would call do_something(5, 17.4);
wrapper<do_something_else> obj2; //Should be able to deduce Args to be [std::string const&, double&, int]
double value = 5;
obj2("Hello there!", value, 70); //Would call do_something_else("Hello there!", value, 70);
}
In beiden Verwendungen von /*???*/
, ich versuche, herauszufinden, was ich konnte dort setzen, dass diese Art von Code ermöglichen würde.
Das folgende scheint nicht zu funktionieren, aufgrund Args
nicht vor seiner ersten Verwendung definiert (zusammen mit dem, was ich annehmen muss, sind zahlreiche Syntaxfehler neben), und selbst wenn es tat, suche ich noch eine Version, die sich nicht ausdrücklich schriftlich der Typen erfordern:
template<void(*Func)(Args ...), typename ... Args)
struct wrapper {
void operator()(Args ...args) const {
Func(std::forward<Args>(args)...);
}
};
wrapper<do_something, int, double> obj;
Sie bedeuten [std :: function] (http://en.cppreference.com/w/ cpp/Dienstprogramm/Funktion/Funktion)? – bolov
@bolov Was ich speziell suche, ist eine Möglichkeit, 'Args' aus der' Funktion' abzuleiten. 'std :: function' passt Funktionszeiger an, indem diese Typen explizit in der Typparameterliste angegeben werden. – Xirema
Akzeptieren Sie C++ 17? wink wink – bolov