将可变参数模板参数与 lambda 参数匹配

Match variadic template args to lambda parameters

本文关键字:参数 lambda 变参      更新时间:2023-10-16

我想写一个你像这样调用的函数:

f("a", 1,                 [](float a                  ) { … });
f("a", 1, "b", 2,         [](float a, float b         ) { … });
f("a", 1, "b", 2, "c", 3, [](float a, float b, float c) { … });

函数的作用无关紧要。关键是要f的每对字符*/整数参数对应于 lambda 函数的浮点参数。我得到这个:

template <typename ...Args>
void f(Args... args, std::function<void(???)> cb);

如何声明函子类型,以便其参数的基数与输入对的基数匹配?

当需要函数对象参数时,通常只允许函数接受任何类型,并让编译器在类型实际不匹配时自动发出错误。

template <typename... Args, typename F>
void f(const F& func, Args&&... args) { ... }

(请注意,我已将函数参数移到前面,因为可变参数部分将消耗所有参数。