您的位置:首页 > 编程语言 > C语言/C++

C++14::lambda函数的类型

2015-11-15 13:17 323 查看

问题

auto 自动类型推导关键字隐去了一切有关对象类型的信息,通过typeid关键字我们可查阅一般对象(甚至是函数指针)的类型信息。

auto i = 42;
typeid(i).name()    // int

double f() { return 0.;}
auto l = f;
cout << typeid(l).name() << endl;
// double (__cdecl*)(void)

typedef int(*Func)(int, int);
auto l = Func();
cout << typeid(l).name() << endl;
// int (__cdecl*)(int,int)


然而如果我们想使用typeid关键字查看lambda函数的类型信息:



lambda的类型

Lambda的类型,是个不具名function object(或称functor)。每个lambda表达式的类型是独一无二的。

auto l1 = []{};
auto l2 = []{};
cout << typeid(l1).name() << endl;
cout << typeid(l2).name() << endl;
//  class <lambda_ba04e06061e67fcbf8089a159f12084d>
//  class <lambda_1e7023d264f05a684a30712bba49d636>


除了能得到两个对象均是lambda函数外,无法通过typeid关键字获得额外的信息。

通过模板捕获类型

std::function<int(int, int)> returnLambda()
{
return [](int x, int y){ return x*y};
}
// #include <functional>
int main(int, char**)
{
auto lf = returnLambda();
std::cout << lf(3, 5) << std::endl;
return  0;
}


使用decltype关键字

auto func = []{cout << "hello world" << endl;}
// func是函数对象,而非类型
decltype(func) f;
// decltype(func)获得对象的类型
f();
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: