是否可以将C++ 0x lambda转换为clang块?

Slu*_*ips 25 c++ lambda clang c++11

我想知道是否有可能将C++ 0x lambda转换为clang块.到目前为止,我在其上看到的任何事情都涉及他们之间的分歧.我研究这个问题的主要原因是制作一个最终的包装器libdispatch,虽然我非常了解它们的dispatch_*_f功能,但与它们的块对应物相比,它们的使用信息却相当缺乏.

到目前为止,我已经能够找到有关将C++ lambda转换为函数指针的信息,但这更像是反过来的.

如果有人知道任何与此相关的内容,并且可以提供链接,或者至少指出我正确的方向,我会非常感激.(即使是"目前不可能"的答案也足够了)

cop*_*pro 12

隐式启用此转换的补丁刚刚添加到clang trunk.


Pau*_* II 6

通常,当lambda用于"向下"闭包时,您可以通过转换将c ++ lambda转换为clang块:

[&](int i) { return i; }
Run Code Online (Sandbox Code Playgroud)

至:

^(int i) { return i; }
Run Code Online (Sandbox Code Playgroud)

仍有一些微妙的差异.Clang的块只能通过const捕获C++类.我不知道这是否包括C++ POD类型.

最后,如果需要"向上"关闭,那么两者就会大幅度分歧.Clang的块需要捕获的变量被注释__block,编译器将在堆上分配它.然而,在C++中,lambda捕获的方式需要根据对象的生命周期来决定(即通过值制作副本或通过引用).

同样在C++中,复制闭包是由C++中的复制构造函数机制自动处理的.然而,随着铿锵的块,Block_copy并且Block_release需要被调用来处理该块的复制.一个简单的包装器可以用C++编写来处理这个问题.例如:

typedef void (^simple_block)(void);
class block_wrapper 
{
  simple_block block;

public:
  block_wrapper (const simple_block& x)
  : block(Block_copy(x)) {}

  void operator() () const
  {
    block();
  }

  block_wrapper(const block_wrapper& rhs) 
  : block(Block_copy(rhs.block)) 
  {}

  block_wrapper& operator=(const block_wrapper& rhs)
  {
    if (this != &rhs)
    {
      Block_release(this->block);
      this->block = Block_copy(rhs.block);
    }
    return *this;
  }

  ~block_wrapper () 
  {
    Block_release(this->block);
  }
};
Run Code Online (Sandbox Code Playgroud)