加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

C 11 lambda和模板专业化

发布时间:2020-12-16 10:52:54 所属栏目:百科 来源:网络整理
导读:我想知道下面给出的lambda的正确类型定义是什么,以便下面的代码将使用符合c 11的编译器进行编译: #include cstdio#include stringtemplateclass Funcclass foo{public: foo(Func func) : fum(func){} Func fum;};int main(){ foo??? fi([](int i) - bool {
我想知道下面给出的lambda的正确类型定义是什么,以便下面的代码将使用符合c 11的编译器进行编译:

#include <cstdio>
#include <string>

template<class Func>
class foo
{
public:
   foo(Func func)
   : fum(func){}
   Func fum;
};

int main()
{
   foo<???> fi([](int i) -> bool { printf("%d",i); return true; });
   fi.fum(2);
   return 0;
}

我想另一种可以做到的方式是这样的:

template<typename Func>
foo<Func> make_foo(Func f)
{
   return foo<Func>(f);
}

int main()
{
   auto fi = make([](int i) -> bool { printf("%d",i); return true; });
   fi.fum(2);
   return 0;
}

解决方法

这是自动decltype:

auto l = [](int i) -> bool { printf("%d",i); return true; };
foo<decltype(l)> fi(l);
fi.fum();

每个lambda都有一个不同的,唯一的,未命名的类型.作为一名程序员,你无法命名.

但是,在你的情况下,由于lambda不捕获任何东西(empty []),它可以隐式转换为指向函数的指针,所以这样做:

foo<bool(*)(int)> fi([](int i) -> bool { printf("%d",i); return true; });
fi.fum();

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读