2014-03-28 75 views
0

我想讓我的getEnd函數返回一個閉包,並保存開始。如何從函數返回閉包?

當我把這個關閉它應該返回的時間差......

如何實現它在C++?

喜歡的東西如下:

using namespace std; 

long microtime() { 
    timeval time; 
    gettimeofday(&time, NULL); 
    long microsec = ((unsigned long long)time.tv_sec * 1000000) + time.tv_usec; 
    return microsec; 
} 


std::function<void()> getEnd(){ 
    long start = microtime(); 
    long end() { 
    return microtime() - start; 
    } 
    return end; 
}; 
+0

有什麼問題與您當前的代碼? (對於沒有準備好編譯器的thost來試試它...) – anderas

+1

首先,你*知道如何編寫[lambda表達式](http://en.cppreference.com/w/cpp /語言/λ)? –

+0

@KonradRudolph,非常感謝您的正確問題標題) –

回答

2
#include <functional> 
std::function<long()> getEnd() 
{ 
    long const start = microtime(); 
    return [=]{ return microtime() - start; }; 
} 

請注意,以上將在堆中分配內存,所以對於大多數實際應用中更好的替代方法是

struct timer { 
    long const start; 
    timer(): start(microtime()) {} 
    long operator()() { return microtime - start(); } 
}; 

timer getEnd() { return timer(); } 
+0

我有'.cpp:15:1:錯誤:'函數'在名字空間'std'沒有在代碼行上命名一個類型'std :: function getEnd ()'如何正確地聲明返回lambda的函數? –

+0

你缺少'#包括' – bobah

+0

感謝結構作爲一個功能的例子,但我的一般目標是瞭解lambda表達式...如何正確地聲明一個返回lambda函數?你的第一個代碼返回錯誤(我已經添加'#包括') –