Variadic Templates Parameter Matching in der STD :: Funktion
Ich habe folgenden Code:
#include <iostream>
#include <functional>
template<typename Return, typename... Params>
void func(std::function<Return(Params... )> x) {}
void f(double) {}
int main() {
//func<void, double>(f); // compile error here in the variadic case
func(std::function<void(double)>(f));
}
Ich habe 2 Fragen:
1. Ich verstehe nicht warum die Leitung funktioniertfunc<void, double>(f);
Gib mir einen Kompilierungsfehler
/Users/vlad/minimal.cpp:10:5: error: no matching function for call to 'func'
func<void, double>(f); // compile error here in the variadic case
^~~~~~~~~~~~~~~~~~
/Users/vlad/minimal.cpp:5:6: note: candidate template ignored: could not match 'function<void (double, type-parameter-0-1...)>' against 'void (*)(double)'
void func(std::function<Return(Params... )> x) {}
^
1 error generated.
wohingegen wenn ich den parameter umsetzef
zu einemstd::function
(wie in der nicht kommentierten Zeile) funktioniert es.
2. Und das verwirrendste Problem ist das, wenn ich eine nicht-variadische Version von benutzefunc
(d. h. nur ersetzentypename...
durchtypename
also in der Tatfunc
nimmt einstd::function<Return(Params)>
als Parameter), dann die kommentierte Zeile inmain
funktioniert wie gewünscht. Irgendwelche Ideen warum?