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

问题

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 
    //  class 

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

通过模板捕获类型

std::function<int(int, int)> returnLambda()
{
    return [](int x, int y){ return x*y};
}
                // #include 
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();

你可能感兴趣的:(C/C++)