2014-01-30 131 views
4

我正在寫一個模板函數,該函數將一個函數對象(現在爲lambda)作爲參數,lambda數據類型作爲模板參數,並返回lambda返回的相同類型。就像這樣:返回類型的C++ lambda

template<typename TFunctor, typename TReturn> 
TReturn MyFunc(TFunctor &Func, TReturn) //The second arg is just to keep the template spec happy 
{ 
    return Func(); 
} 

及消費代碼是這樣的:

int n = MyFunc([](){return 17;}, int()); 

我不喜歡醜陋的方式指定了返回的數據類型。在編譯器生成的lambda類中是否有一些內置的typedef可以給我它的返回類型?這樣MYFUNC可以去在某種程度上是這樣的:

template<typename TFunctor> 
TFunctor::return_type MyFunc(TFunctor &Func) 
{ //... 

我希望它返回LAMBDA回報不明確列明該類型相同的類型。

編輯:現在,我關心的所有lambda都是沒有說服力的。變量捕獲也可以做到這一點。

+5

像這樣 - http://stackoverflow.com/a/8462724/673730? –

+0

取決於'TFunctor'的真正含義,它可能有一個重載的'operator()',這意味着返回類型可以取決於你給它的參數。 (雖然對於非泛型lambda表達式不適用) – leemes

+0

@leemes對於泛型lambda表達式,not * not * true。隨着將多態lambda表達式引入C++ 1y,這將會發生變化。 – Nevin

回答

4

由於返回類型可能取決於給函子的參數,因此您需要在某處指定它們以查詢返回類型。因此,當談到泛型函數時(並不是將它們限制爲(非泛型)lambdas),在不知道參數類型時不可能確定返回類型。

C++ 11具有能夠與結合使用,以便通過命名其可以依賴於函數的參數(這裏的表達式來指定函數的返回類型後返回類型關鍵字decltype,它取決於什麼Func是):

template<typename TFunctor> 
auto MyFunc(TFunctor &Func) -> decltype(Func(/* some arguments */)) 
{ ... } 

所以,如果你不帶參數來調用它,例如(我認爲這看你的拉姆達例如,當),簡單地寫:

template<typename TFunctor> 
auto MyFunc(TFunctor &Func) -> decltype(Func()) 
{ 
    return Func(); 
} 

在C++ 14,你甚至可以完全省略返回類型和簡單的寫

template<typename TFunctor> 
auto MyFunc(TFunctor &Func) 
{ 
    return Func(); 
} 

注意,即使在C++ 03,你不必提供另一個函數的參數;另一個模板參數就足夠了:

template<typename TReturn, typename TFunctor> 
TReturn MyFunc(TFunctor &Func) 
{ 
    return Func(); 
} 

int n = MyFunc<int>(someFunctorReturningAnInt);