C++14::lambda函式的型別

Inside_Zhang發表於2015-11-15

問題

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();

相關文章