Давайте рассмотрим следующие функции:
// run_cb_1(): Explicitly defined prototype
void run_cb_1(const std::function<void(int)> & callback, int p)
{
callback(p);
}
// run_cb_2(): One template parameter
template <typename T>
void run_cb_2(const std::function<void(T)> & callback, const T & t)
{
callback(t);
}
// run_cb_3(): Variable number of template parameters
template <typename ... Args>
void run_cb_3(const std::function<void(Args...)> & callback, const Args & ... args)
{
callback(args...);
}
Теперь, если я хочу использовать эти функции следующим образом:
int main()
{
auto f = [](int a){
std::cout << a << '\n';
};
run_cb_1(f, 5); // OK
run_cb_2(f, 5); // KO --> I understand why
run_cb_2<int>(f, 5); // OK
run_cb_3(f, 5); // KO --> I understand why
run_cb_3<int>(f, 5); // KO --> I don't understand why...
return 0;
}
Я получаю "нет соответствующего вызова функции" с run_cb_2()
и run_cb_3()
, в то время как он прекрасно работает с run_cb_1()
.
Я думаю, что он ведет себя так, как ожидалось, потому что я не предоставил тип для аргумента шаблона (так как он не может бытьвыводится тривиально, как для run_cb_1()
).
Но указание типа шаблона решает проблему для run_cb_2()
(как я и ожидал), но не для run_cb_3()
.
Я знаю, что могу решить это или , явно объявив f
как:
std::function<void(int)> f = [](int a){
std::cout << a << '\n';
};
или , передав f как:
run_cb_2(std::function<void(int)>(f), 5);
run_cb_3(std::function<void(int)>(f), 5);
У меня такой вопрос: Почему вывод аргумента шаблона завершается неудачно с run_cb_3()
(с переменными параметрами шаблона) даже при явном указании типа (ов) шаблона?
ЭтоОчевидно, что я что-то упустил (может быть, основной), но я не знаю, что это такое. Любая помощь будет оценена.