[英]Can I use template type T in std::function to pass a lambda type function C++11?
我是c ++ 11的新手,我定义了一个模板来将一个函数作为参数,
template <typename T>
void print_for_each(vector<T> v, std::function<void (T)> func){
std::for_each(v.begin(), v.end(), func);
}
我试图将以下Lambda表达式传递给print_for_each,
auto printElement = [](int y) {
std::cout << y << " ";
};
然后我收到编译器警告说,
错误:没有用于调用'print_for_each'的匹配函数
然后我改变了模板功能,
std::function<void (int)> func)
这次有效。 我的问题是,std :: function可以采用模板类型T吗?
谢谢你的回答! :)
Lambdas 与 std::function
s不同。 前者是伪装的仿函数(函数对象),而后者是不同的野兽。 即使lambda对std::function
“衰减”,在模板类型推导中,编译器也不会执行隐式转换。 因此,在这种情况下,编译器会尝试匹配两个不兼容类型的对象,因此它会失败。
您可能想知道为什么编译器不执行此类隐式转换。 这是因为通过在参数类型推导之上执行类型转换,可以达到许多“矛盾”的情况,其中多个不兼容的类型可以是候选者。
可能的解决方案:
您可以将功能的签名更改为
template <typename T, typename F> void print_for_each(vector<T> v, F&& func){ std::for_each(v.begin(), v.end(), func); }
你可以将lambda包装在std::function
并将后者传递给你的函数(参见@Brian的评论)
您可以“帮助”编译器并显式指定模板类型参数
print_for_each<int>(v, func);
在这种情况下,没有模板类型推导,并且允许lambda通过隐式转换衰减到std::function
。
std::for_each
不需要std::function
,只需要一个std::function
函数。 您的模板应该这样做:
template< typename C, typename F >
void print_for_each( C& c, F f )
{
std::for_each( c.begin(), c.end(), f );
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.