2015-08-08 267 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指针并返回)是不可移植的,但是我的完全正确(将函数指针强制转换为另一个函数指针并返回)。 –