相关疑难解决方法(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::function 类型中。在这种情况下,是否可以从 lambda 的捕获列表中提取参数?

例子

struct foo
{
    std::vector<int> t = {1,2,3};
};

void funct(std::function<void()> func)
{
    func(); //This works fine . Can I extract the object foo from this lambda ?
}

int main()
{
   foo a;
   a.t.push_back(45);
   funct( [a](){ std::cout << "New value is " << a.t[3] ; } );
}
Run Code Online (Sandbox Code Playgroud)

c++ lambda c++11

6
推荐指数
1
解决办法
1090
查看次数

搜索技巧以避免在类模板中创建字段

我有像类一样的范围保护(这是简化的测试用例):

template<void(*close)()>
struct Guard1
{
  template<typename O>
  Guard1(O open) { open(); }

  ~Guard1() { close(); }
};

void close() { std::cout << "close g1\n"; }

int main()
{
  Guard1<close> g1 = [](){ std::cout << "open g1\n"; };
}
Run Code Online (Sandbox Code Playgroud)

我修改它,使得close表达式也可以作为lambda给出:

class Guard2
{
  std::function<void()> close;
public:

  template<typename O, typename C>
  Guard2(O open, C close) : close(close)
  {
    open();
  }

  ~Guard2() { close(); }
};


int main()
{
  Guard2 g2(
      [](){ std::cout << "open g2\n"; },
      [](){ std::cout << "close g2\n"; }); …
Run Code Online (Sandbox Code Playgroud)

c++

5
推荐指数
1
解决办法
149
查看次数

标签 统计

c++ ×3

c++11 ×2

lambda ×2

templates ×1