返回功能指向自我的指针?

bit*_*ise 7 c++ function-pointers

下面的代码不能编译..但是有没有办法让函数指针返回另一个与自身等效的函数指针?

typedef FunctionPtr (*FunctionPtr)(int, int);

FunctionPtr Second(int, int);
FunctionPtr First(int, int)
{
    // do something
    return Second;
}

FunctionPtr Second(int, int)
{
    // do something
    return First;
}

int main()
{
    FunctionPtr a = First(1, 2);
    FunctionPtr b = a(2, 3);
    FunctionPtr c = b(4, 5);
    c(5, 6);
}
Run Code Online (Sandbox Code Playgroud)

ham*_*mar 5

简答:不,你不能直接这样做.你可以通过使用void指针来接近,但它是非标准的,因为无法保证void指针足够大以适应函数指针.有关详细信息,请参阅本周大师#57.

最接近标准兼容的方法是为函数指针定义包装类型:

 struct Wrapper;
 typedef Wrapper (*FunctionPtr)(int, int);
 struct Wrapper {
    Wrapper(FunctionPtr ptr): wrapped(ptr) { }
    operator FunctionPtr() { return wrapped; }
    FunctionPtr wrapped;
 };
Run Code Online (Sandbox Code Playgroud)

现在你可以写:

Wrapper Second(int, int);
Wrapper First(int, int) {
    // do something
    return Second;
}

Wrapper Second(int, int) {
    // do something
    return First;
}

int main() {
    FunctionPtr a = First(1, 2);
    FunctionPtr b = a(2, 3);
    FunctionPtr c = b(4, 5);
    c(5, 6);
}
Run Code Online (Sandbox Code Playgroud)


seh*_*ehe 1

这是我在大约 15 分钟内最接近的一次......:

#include <stdio.h>

struct container
{
    typedef container (*Ptr)(int, int);
    const Ptr _ptr;
    explicit container(Ptr ptr) : _ptr(ptr) { }
    operator Ptr() const { return _ptr; }
};

struct container narcissus(int a, int b)
{
  printf("Narcissus: %i %i.\n", a, b);

  return container(narcissus);
}

int main(void)
{
  narcissus(3, 4)(5, 6)(7, 8);
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

现在,让这个婴儿通用 N 个参数作为练习留给读者:)