2015-08-08 202 views
0

C++中是否有一種模式允許您返回一個返回函數本身的函數。 例如C++ Lambdas:函數返回一個函數,返回一個函數...?

std::function<...> func = ...; 
do 
{ 
    func = func(); 
} 
while (func); 

在C語言中,我認爲你可以使用鑄造void *的爲void *(*)()實現它。 所以你會有

typedef void* (*MyFunc)(void); 
MyFunc func = ... 
do 
{ 
    func = (MyFunc)func(); 
} 
while(func); 

是否有可能實現lambdas?

+4

你C示例不可移植,標準C不允許轉換func指針指向其他類型的指針。 –

+1

@Olaf,問題不是「我可以在C中使用lambda表達式嗎?」它是「我可以用C++中的lambda來做到這一點嗎?」所以C是否支持lambda表達式並不重要。 –

+0

這是一個非常模糊的提示。 –

回答

2

您的C例子是無效的ISO C.它可以在C只使用也是有效的C的特徵進行++:

typedef void (*func_type)(); 
typedef func_type (*func_func_type)(); 

int i = 5; 
func_type f() { return --i ? (func_type)f : 0; } 

int main() 
{ 
    func_func_type func = f; 
    do 
    { 
    func = (func_func_type)func(); 
    } 
    while(func); 
} 

不能重新寫這直接因爲使用lambda表達式拉姆達不能引用本身(如f一樣),但你可以在lambda轉換爲一個函數指針,保留從一個函數指針類型強制轉換到另一個,並將其存儲在一個std::function這樣的:

#include <functional> 

typedef void (*func_type)(); 
typedef func_type (*func_func_type)(); 

int i = 5; 
func_func_type f = (func_func_type)[]{ return --i ? (func_type)f : nullptr; }; 

int main() 
{ 
    std::function<func_type()> func = f; 
    do 
    { 
    func = (func_func_type)func(); 
    } 
    while(func); 
} 
+0

我知道這是無效的,並且不適用於例如AVR拱門。然而,它會在我關心的架構上,比如ARM和x86,許多代碼和庫使用的都很好,例如參見dlopen(3)。不過謝謝你的例子,我認爲這就是我需要的。 – nulleight

+0

你的例子(將一個函數指針轉換爲void指針並返回)是不可移植的,但是我的完全正確(將函數指針強制轉換爲另一個函數指針並返回)。 –