Slu*_*ips 25 c++ lambda clang c++11
我想知道是否有可能将C++ 0x lambda转换为clang块.到目前为止,我在其上看到的任何事情都涉及他们之间的分歧.我研究这个问题的主要原因是制作一个最终的包装器libdispatch
,虽然我非常了解它们的dispatch_*_f
功能,但与它们的块对应物相比,它们的使用信息却相当缺乏.
到目前为止,我已经能够找到有关将C++ lambda转换为函数指针的信息,但这更像是反过来的.
如果有人知道任何与此相关的内容,并且可以提供链接,或者至少指出我正确的方向,我会非常感激.(即使是"目前不可能"的答案也足够了)
通常,当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)
归档时间: |
|
查看次数: |
2594 次 |
最近记录: |