C++ 如何在C++;?
这是一个我试图实现的小例子。甚至可以将lambda传递到模板函数中吗 头文件C++ 如何在C++;?,c++,templates,lambda,C++,Templates,Lambda,这是一个我试图实现的小例子。甚至可以将lambda传递到模板函数中吗 头文件 class my_impl { public: template<typename F> void do_something(F && f); }; // .cpp file template<typename F> my_impl::do_something(F && f) { // ... implementation } template
class my_impl {
public:
template<typename F> void do_something(F && f);
};
// .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\u impl{
公众:
模板无效做某事(F&F);
};
CPP文件
class my_impl {
public:
template<typename F> void do_something(F && f);
};
// .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( []() {
...
} );
/.cpp文件
模板my_impl::do_something(F&&F)
{
//…实施
}
模板void my_impl::do_something(std::string&&);//好啊
模板void my_impl::do_something(???);//兰姆达怎么了?
//像这样使用
我的建议;
请求做某事(“123”);
请求做某事([](){
...
} );
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( []() {} );
}
class my\u impl{
公众:
模板无效做某事(F&F);
};
模板void my_impl::do_something(F&&F)
{
}
int main()
{
我的建议;
m、 做某事([](){});
}
使用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
t.C:22处的主管道
22 m.做某事([](){});
(gdb)s
my_impl::do_something()(this=0x7fffffffe44d,f=)
在t.C:9
注意,gdb将模板实例报告为typemy\u impl::do\u something
。编译器为lambda类型生成了一个内部伪类型main():
。当然,您不能引用这样的类型
我看不到引用lambda的内部类型的方法。lambda的类型取决于lambda本身。 你能行
auto l=[] (/*arguments*/) {/*body*/};
template void my_impl::do_something<decltype(l)>(decltype(l)&&);
您已经可以使用它了,您需要的是如何显式实例化此模板。
//确定
和//lambda
行在示例代码中根本不需要。删除它们,代码就会编译。请更清楚地说明为什么您认为需要它们。@Yakk注意,它们在.cpp文件中。您是否尝试过复制粘贴上面的示例代码,删除这两行并编译它们?同样,您仍然不需要这些行。我知道有“附近”的问题,您可能需要这些行,但发布实际存在问题的代码。在提交之前,将代码带回编译器,并确保它仍然具有所需的属性。伪代码在这里是无用的。@Ragnar:你想为lambda编写专门化吗?!这适用于琐碎的lamba。但我需要捕获类成员字段和一些局部变量,这些变量会根据使用情况而变化。