c++ 11 lambda和模板专门化
C++11 lambda and template specialization
我想知道下面给出的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;
}
是auto
+ decltype
:
auto l = [](int i) -> bool { printf("%d",i); return true; };
foo<decltype(l)> fi(l);
fi.fum();
每个lambda都有一个不同的、唯一的、未命名的类型。你,作为一个程序员,只是不能命名它。
然而,在您的情况下,由于lambda没有捕获任何内容(空[]
),因此它可以隐式地转换为指向函数的指针,因此可以这样做:
foo<bool(*)(int)> fi([](int i) -> bool { printf("%d",i); return true; });
fi.fum();
是std::function<bool(int)>
。如果您喜欢,也可以只使用bool(*)(int)
,因为lambda无法捕获。
(原始函数指针可能更有效一点,因为std::function
确实(至少在某些情况下)需要动态分配一些类型擦除魔法。)
相关文章:
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 可组合的lambda/std::函数与std::可选
- C++Boost Asio Pool线程,带有lambda函数和传递引用变量
- 如何建立使用模板函数的lambda函数的尾部返回类型
- 是否可以对零模板参数进行模板专门化
- 如何将lambda作为模板类的成员函数参数
- C++从其他 constexpr 创建 lambda 不能按顺序执行 Constexpr
- 在 lambda 捕获中声明的变量的类型推导
- 我可以将调用类的"this"传递给 lambda 函数吗?
- 为什么lambda在clang上崩溃而不是在gcc上崩溃
- 模板函数指针和lambda
- 两组使用lambda函数的大括号
- 使lambda不可复制/不可移动
- FLTK:按下哪个按钮 - 将数字传递给按钮的回调 (lambda)
- 尝试将lambda函数放在队列中时出现一般分配器错误(可能是与unique_ptr有关的错误)
- 将带有unique_ptr的可变 lambda 传递给 const&std::function
- AWS Lambda C++运行时权限被拒绝
- 捕获lambda中的std::数组
- std::unordered_map-使用Lambda专门化KeyEqual
- c++ 11 lambda和模板专门化