我偶然发现了以下lambda语法,我不明白:
<scale xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="200"
android:fromXScale=".8"
android:fromYScale=".8"
android:pivotX="50%"
android:pivotY="50%"
android:fillAfter="true"
android:toXScale="1.0"
android:toYScale="1.0" >
</scale>
上面的程序会产生一个输出:
#include <iostream>
template<typename Callback>
void do_it(Callback callback) {
callback();
}
template<typename T>
void p() {
std::cout << __PRETTY_FUNCTION__ << std::endl;
}
int main() {
auto a = <:&:> { };
p<decltype(a)>();
do_it(<:&:> { std::cout << "Hello" << std::endl; }); //this
}
你能解释一下,void p() [with T = main()::__lambda0]
Hello
是什么意思吗?是否有可能将这种方式声明为带有参数的lambda?
答案 0 :(得分:42)
<:
和:>
是digraphs。它们分别被翻译为[
和]
。因此,您的代码等同于:
auto a = [&] { };
do_it([&] { std::cout << "Hello" << std::endl; });
所以它只是一个lambda,通过引用捕获所有内容。
要声明一个带有这样的参数的lambda,只需在捕获组之后添加一个参数列表:
auto a = <:&:> (AType) { };
如果你想要任何阅读你代码的人讨厌你,你可以尽可能使用有向图和三字符组合:
auto a = <:&??)??<%>;
// ^ same as [&]{}