使用lambda表达式的函数

DeX3

出于练习目的,我想创建一个类似于以下内容的函数std::transform()

template<class Tin, class Tout>
std::vector<Tout> map( const std::vector<Tin>& in,
                       const std::function<Tout(const Tin&)>& mapper ) {

   std::vector<Tout> ret;
   for( auto elem : in ) {
       ret.push_back( mapper( in ) );
   }

   return ret;
}

我打算将其按如下方式使用:

std::vector<Bar> bars /* = ... */;
std::vector<Foo> foos = map( bars, []( const Bar& bar ) { return bar.to_foo(); } );

但是,我得到了函数调用的未定义引用。我的map()功能的正确签名是什么?

*更新:*这是实际的错误消息(Bar = std::stringFoo = IPv6(自己的类))

config.cc:98:61: error: no matching function for call to ‘map(const std::vector<IPv6>&, InterfaceConfig::set_ip6(const std::vector<IPv6>&)::<lambda(const IPv6&)>)’
config.cc:98:61: note: candidate is:
utils.h:38:31: note: template<class Tin, class Tout> std::vector<Tout> utils::map(const std::vector<Tin>&, const std::function<Tout(const Tin&)>&)

这就是调用:std :: vector字符串= utils :: map(ips,[](const IPv6&ip){return ip.to_string();});

皮埃尔·福格(Pierre Fourgeaud)

您的代码中有两件事是行不通的。

  • 首先,当将lambda函数作为参数传递时,建议使用Template例如,Microsoft上的标准库似乎使用此方法std::for_each
  • 和 :

    当函数模板具有不能从参数推断出的返回类型时,或者当函数模板没有任何参数时,编译器将无法推断出该类型。此函数将需要模板类型参数说明

看一下这个例子:

template<class Tout, class Tin, class Fun>
//                            ^^^^^^^^^^^
// Note that I changed the order of the types
std::vector<Tout> map( const std::vector<Tin>& in,
                       Fun mapper ) {
//                     ^^^^^^^^^^
   std::vector<Tout> ret;
   for( auto elem : in ) {
       ret.push_back( mapper( elem ) );
   }

   return ret;
}

int main()
{
    std::vector<int> bars /* = ... */;
    std::vector<float> foos = map<float>( bars, []( int ) { return 1.0f; } );
    //                           ^^^^^^^ Specify the type Tout
    system( "pause" );
    return 0;
}

编辑 :

就像注释中所说的那样,我们可以使用decltypestd::decay不必显式指定函数的结果:

  template<class Tin, class Fun> // no Tout
//                  ^^^^^^^^^^^
  auto map( const std::vector<Tin>& in, Fun mapper )
//^^^^                                  ^^^^^^^^^^
    -> std::vector<typename std::decay< decltype( mapper( in.front() ) )>::type > {

   std::vector<typename std::decay< decltype( mapper( in.front() ) )>::type > ret;


   for( auto elem : in ) {
       ret.push_back( mapper( elem ) );
   }

   return ret;
}

int main()
{
    std::vector<int> bars /* = ... */;
    std::vector<float> foos = map( bars, []( int ) { return 1.0f; } );
    //                           No specification
    system( "pause" );
    return 0;
}

让我们解释一下。

首先,我们将使用最新指定的返回类型语法。这将使我们能够在返回类型规范中使用参数名称。我们以开始auto,并将返回类型指定放在参数之后,使用->

我们将使用decltype因为decltype类型说明符会产生指定表达式的类型。在我们的案例中这将非常有用。例如,要获取我们传入参数的函数的类型,它就是decltype( f( someArg ) )

让我们陈述一下我们想要什么:函数的返回类型应该是传入参数right的函数的返回类型的向量?这样我们就可以回来std::vector< decltype( mapper( in.front() ) )>了!(为什么in.front()?我们必须将参数传递给函数以具有有效的表达式。)

但是,这里又有一个问题:std::vector不允许引用。为了确定对我们来说这不是问题,我们将使用std::decay元函数将左值到右值,数组到指针和函数到指针的隐式转换应用于类型T,删除cv- qualifiers删除引用,并将结果类型定义为成员typedef类型。也就是说,如果函数返回的内容类似const Foo&它将以结尾Foo

所有这些的结果:std::vector< typename std::decay< decltype( mapper( in.front() ) )>::type >

您必须在函数的开头再次重复此表达式,以声明将要返回的变量。

一些有用的参考资料:

这不容易解释,我希望我的解释是可以理解的。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用lambda表达式的递归函数

来自分类Dev

如何对需要委托列表的函数使用lambda表达式

来自分类常见问题

使用'key'和lambda表达式的python max函数

来自分类Dev

在lambda表达式中使用外部函数

来自分类Dev

在lambda表达式中使用外部函数

来自分类Dev

什么时候在lambda表达式前使用#'(函数)?

来自分类Dev

在解析lambda表达式中使用try函数

来自分类Dev

为什么我使用 lambda 表达式而不是函数?

来自分类Dev

如何使用 lambda 表达式实现递归函数

来自分类Dev

Lambda表达式与过程样式函数

来自分类Dev

复制lambda表达式的构造函数

来自分类Dev

Java函数的Lambda表达式实现

来自分类Dev

使用条件表达式选择lambda表达式

来自分类Dev

在会话中使用Lambda表达式

来自分类Dev

如何使用|| 在lambda表达式中

来自分类Dev

如何使用Lambda表达式求和

来自分类Dev

使用Lambda表达式的子查询

来自分类Dev

使用Lambda表达式设置方法

来自分类Dev

在会话中使用Lambda表达式

来自分类Dev

如何使用|| 在lambda表达式中

来自分类Dev

使用lambda表达式构造线程

来自分类Dev

尝试使用 Esper Lambda 表达式

来自分类Dev

什么是“使用函数”表达式?

来自分类Dev

使用lambda表达式在Scheme中定义函数的原因是什么?

来自分类Dev

在Python中使用lambda表达式实现字符串包含函数

来自分类Dev

C#-使用任意委托类型的表达式树创建lambda函数

来自分类Dev

从Python使用最小化时Julia中的函数和Lambda表达式

来自分类Dev

如何在使用带有 lambda 表达式的 Pandas 应用函数时消除类型错误

来自分类Dev

表达式树-参数未从lambda函数参数映射到表达式参数

Related 相关文章

热门标签

归档