有没有办法将lambda传递给一个带有std::function<void(T)>
参数的函数模板,并且从lambda的参数中推导出T
模板参数,而不是必须明确说明它?
也就是说,给定[](std::string){...}
形式的lambda,推导T
是std::string
?
示例:
所以使用功能模板
template<typename T>
void func(std::function<void(T)> f) { ... }
我可以通过明确指定std::string
来调用func,如下所示:
func<std::string>([](std::string){...});
我想推断std::string
,并按如下方式调用func:
func([](std::string){...});
下面的示例应用
#include <iostream>
#include <functional>
template<typename T>
void func(std::function<void(const T&)> f)
{
T m = "hello world";
f(m);
}
struct foo
{
void bar(std::string msg)
{
std::cout << __func__ << ": " << msg << std::endl;
}
};
int main()
{
foo f;
// explicit specification works
func<std::string>([&](const std::string& m) {
f.bar(m);
});
// relying on argument deduction fails
// func([&](const std::string& m) {
// f.bar(m);
// });
return 0;
}