如何在C ++中的模板定义中使用lambda?

时间:2015-12-19 17:11:11

标签: c++ templates lambda

这是我尝试实现的一个简单例子。甚至可以将lambda传递给模板函数吗?

HEADER FILE

class my_impl {
public:
    template<typename F> void do_something(F && f);
};

CPP文件

// .cpp file
template<typename F> my_impl::do_something(F && f)
{
    // ... implementation
}

template void my_impl::do_something<std::string &&>(std::string &&); // OK
template void my_impl::do_something<???>(???); // what goes here for lambda?

// used like this
my_impl impl;
impl.do_something( "123" );
impl.do_something( []() { 
   ...
} );

2 个答案:

答案 0 :(得分:0)

lambda是编译器生成的唯一内部类型的唯一实例。

您可以使用调试器自行查看。例如,给出以下简短的测试代码片段:

class my_impl {
public:
    template<typename F> void do_something(F && f);
};

template<typename F> void my_impl::do_something(F && f)
{
}

int main()
{
    my_impl m;

    m.do_something( []() {} );
}

使用gcc 5.3,单步执行调试器,会发现以下结果:

main () at t.C:22
22      m.do_something( []() {} );
(gdb) s
my_impl::do_something<main()::<lambda()> >(<unknown type in /tmp/t, CU 0x0, DIE 0x23e>) (this=0x7fffffffe44d, f=<unknown type in /tmp/t, CU 0x0, DIE 0x23e>)
    at t.C:9

请注意,gdb将模板实例报告为类型my_impl::do_something<main()::<lambda()> >。编译器为lambda类型生成了一个内部假类型main()::<lambda()>。当然,你不能引用那样的类型。

我没有看到引用lambda内部类型的方法。

答案 1 :(得分:0)

lambda的类型取决于lambda本身。 你可以做到

 auto l=[] (/*arguments*/) {/*body*/};
 template void my_impl::do_something<decltype(l)>(decltype(l)&&); 

但是这只适用于lambda l,因为编译器会为每个lambda生成新类型。

可以像

一样使用
my_impl impl;
impl.do_something(l);