繁体   English   中英

我可以在std :: function中使用模板类型T来传递lambda类型函数C ++ 11吗?

[英]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 “衰减”,在模板类型推导中,编译器也不会执行隐式转换。 因此,在这种情况下,编译器会尝试匹配两个不兼容类型的对象,因此它会失败。

您可能想知道为什么编译器不执行此类隐式转换。 这是因为通过在参数类型推导之上执行类型转换,可以达到许多“矛盾”的情况,其中多个不兼容的类型可以是候选者。

可能的解决方案:

  1. 您可以将功能的签名更改为

     template <typename T, typename F> void print_for_each(vector<T> v, F&& func){ std::for_each(v.begin(), v.end(), func); } 
  2. 你可以将lambda包装在std::function并将后者传递给你的函数(参见@Br​​ian的评论)

  3. 您可以“帮助”编译器并显式指定模板类型参数

     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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM