这是我尝试实现的一个简单例子。甚至可以将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( []() {
...
} );
答案 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);