相关疑难解决方法(0)

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仅仅落后于它们的实施?

c++ lambda templates c++11

60
推荐指数
4
解决办法
3万
查看次数

如何使用lambda表达式作为模板参数?

如何使用lambda表达式作为模板参数?例如,作为初始化std :: set的比较类.

以下解决方案应该有效,因为lambda表达式只创建一个匿名结构,它应该适合作为模板参数.但是,产生了很多错误.

代码示例:

struct A {int x; int y;};
std::set <A, [](const A lhs, const A &rhs) ->bool {
    return lhs.x < rhs.x;
    } > SetOfA;
Run Code Online (Sandbox Code Playgroud)

错误输出(我使用g ++ 4.5.1编译器和--std = c ++ 0x编译标志):

error: ‘lhs’ cannot appear in a constant-expression
error: ‘.’ cannot appear in a constant-expression
error: ‘rhs’ cannot appear in a constant-expression
error: ‘.’ cannot appear in a constant-expression
At global scope:
error: template argument 2 is invalid
Run Code Online (Sandbox Code Playgroud)

这是GCC中的预期行为还是错误?

编辑

有人指出,我正在使用lambda表达式错误,因为它们返回了他们所指的匿名结构的实例.

但是,修复该错误并不能解决问题.我收到lambda-expression in …

c++ lambda templates c++11

32
推荐指数
1
解决办法
2万
查看次数

标签 统计

c++ ×2

c++11 ×2

lambda ×2

templates ×2