Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在C++;?_C++_Templates_Lambda - Fatal编程技术网

C++ 如何在C++;?

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

这是一个我试图实现的小例子。甚至可以将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 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将模板实例报告为type
my\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。但我需要捕获类成员字段和一些局部变量,这些变量会根据使用情况而变化。