在C++ 11中,有没有办法模板化lambda函数?或者它本身太具体而无法模板化?
我理解我可以定义一个经典的模板类/仿函数,但问题更像是:语言是否允许模板化lambda函数?
可以lambda表达式被用来作为类模板参数?(注意这是比一个非常不同的问题这一个,其中询问是否lambda表达式本身可以模板化).
我问你是否可以这样做:
template <class Functor>
struct Foo { };
// ...
Foo<decltype([]()->void { })> foo;
Run Code Online (Sandbox Code Playgroud)
这在例如类模板具有各种参数之类的情况下是有用的,这些参数equal_to通常被实现为单行仿函数.例如,假设我想实例化一个使用我自己的自定义相等比较函数的哈希表.我希望能够说出类似的话:
typedef std::unordered_map<
std::string,
std::string,
std::hash<std::string>,
decltype([](const std::string& s1, const std::string& s2)->bool
{ /* Custom implementation of equal_to */ })
> map_type;
Run Code Online (Sandbox Code Playgroud)
但我在GCC 4.4和4.6上对此进行了测试,但它不起作用,显然是因为lambda表达式创建的匿名类型没有默认构造函数.(我记得有一个类似的问题boost::bind.)是否有某些原因标准草案不允许这样做,或者我错了并且允许但是GCC仅仅落后于它们的实施?
可能重复:
使用Boost.Phoenix有什么好处?
所以我开始阅读boost phoenix的文档.
但是,我必须承认我不太了解库的目的,特别是因为我们在C++ 0x中对lambdas有语言支持.
有人可以解释或给我一个例子吗?