lambda表达式可以用作类模板参数吗?(注意这是一个非常不同的问题,与此问题不同,该问题询问的是lambda表达式本身是否可以成为模板。)
我想知道是否可以像以下这样做:
template <class Functor>
struct Foo { };
// ...
Foo<decltype([]()->void { })> foo;
这在一些情况下会很有用,比如一个类模板有各种参数,如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;
但是我在GCC 4.4和4.6上测试了一下,似乎不起作用,这显然是因为由lambda表达式创建的匿名类型没有默认构造函数。(我记得boost::bind
也有类似的问题。)标准草案是否允许这样做,还是我错了,允许这样做,只是GCC在实现上落后了?