如何在C++中的模板定义中使用lambda
How to use lambda in template definition in C++?
下面是我试图实现的一个微不足道的例子。是否可以将lambda传递到模板函数中?
标题文件
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( []() {
...
} );
您可以使用调试器亲眼看到这一点。例如,给定以下测试代码的短片段:
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内部类型的方法。
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);
相关文章:
- 它是否定义了哪些算法可以接受可变 lambda 的实现?
- Tbb 库:错误:编写自定义类函数而不是 lambda 表达式时,对函数的调用不匹配
- 通过 lambda 定义的 constexpr 递归函数
- 通过 lambda unordered_set自定义哈希
- 带有自定义deleter的std::unique_ptr对象的大小(一个由ref捕获的lambda)
- 将lambda放入类定义中的干净方法
- 是否可以使用默认泛型参数在C++中定义 lambda?
- 如何定义与将 Lambda 与捕获作为回调一起使用兼容的函数指针
- 关于函数模板中定义的 lambda 闭包类型可以说些什么?
- 使用本地类型声明的G lambda被使用但从未定义 - 确实是一个错误
- 未定义 Lambda 复制分配运算符
- 何时在C 11 lambda的定义中捕获需要捕获的变量
- 为什么要定义一个返回结构的 lambda 函数,而不是直接定义结构
- 如何定义通用 lambda 参数的模板参数?
- 将 lambda 转换为函数指针类型定义
- 如何在声明和定义中拆分静态lambda
- 定义Lambda的一般指南
- 在 Xcode [c++] 中在断言 (assert.h) 中定义 lambda 时,为类似函数的宏调用提供过多参数会导
- std::唯一指针和自定义lambda删除器错误
- 定义lambda以搜索指向自定义类型的指针向量