返回指针到自身的函数? P> C++中有可能编写一个返回指针的函数吗?< /P>

返回指针到自身的函数? P> C++中有可能编写一个返回指针的函数吗?< /P>,c++,C++,如果没有,请建议其他解决方案,以使以下语法正常工作: some_type f () { static int cnt = 1; std::cout << cnt++ << std::endl; } int main () { f()()()...(); // n calls } 某些类型的f() { 静态int-cnt=1; std::cout您可以使用函数对象的模式: struct f { f& operator () () {

如果没有,请建议其他解决方案,以使以下语法正常工作:

some_type f ()
{
    static int cnt = 1;
    std::cout << cnt++ << std::endl;
}
int main ()
{
    f()()()...(); // n calls
}
某些类型的f()
{
静态int-cnt=1;

std::cout您可以使用函数对象的模式:

struct f
{
  f& operator () ()
  {
    static int cnt = 1;
    cout<<cnt++<<endl;
    return *this;
  }
};

如果需要,您可以选择返回对函数的引用,并返回
*this

更新:当然,类型为
T
的函数在语法上不可能返回
T*
T&

更新2:

当然,如果你想保留你的语法…那就是

some_type f()
{
}
那我有个主意

struct functor;
functor f();
struct functor
{
   functor operator()()
   {
      return f();
   }
};

functor f()
{  
    return functor();
}

int main()
{
    f()()()()();
}

不可以,因为返回类型必须包含函数的返回类型,这是递归的。当然,您可以返回函数对象或类似的对象,这样做。

当然可以,只需查看以下代码即可:


#include <stdio.h>

typedef void * (*func)();

void * test()
{
    printf("this is test\n");
    return (void *)&test;
}

int main()
{
    (*(func)test())();
}

@Armen:+1.您可以简单地执行此操作:
return*this;
无需创建另一个函子!据我所知,*如果在函数中,这将解析为函数地址;如果在成员函数中,则解析为对象地址?@Armen:不仅
return*this;
,还可以将其作为引用返回:
函数和运算符()()
@Nawaz:是的,但我在回答中包含了这句话,不是吗?@Armen:在我发表评论之后,或者可能在我发表评论的同时:D@DumbCoder:问题是要让语法起作用,而不是如何使用相同的函数打印n个数字@San的可能副本:我不认为这个问题是愚蠢的(我认为你本可以选择一个更好的词来表达同样的想法)这是一个好奇的问题。如果一个人想知道一些肮脏的语言角落,并不意味着他想在生产中使用它们code@San我发现这是一个非常有趣的问题,把我带回到了计算机科学的研究生时代。在非类型化的lambda演算中考虑身份函数<代码> i:λx.x/<代码>。呃,你给它。传递它本身(
I
),它返回它自己,这就是这个问题所要求的。不可能用简单类型的lambda演算来定义,因为我们无法表示所需的类型。想象一下C++:
template xi(X){return X;}
。没有
T
的值来生成
I(I)
有效。这是一个需要创造性的、建设性的输入的问题。如果您愿意,可以忽略它。顺便说一句,在C#中实现这一点非常容易:
类C{delegate D D();静态D M(){return M;}
。或者,在函数式语言中实现这一点的传统方法是定义一个接受并返回自己类型的组合符:
类C{delegate D D(D D D);static D M(D D){return M;}}
非常难看的解决方案。如果您想第三次调用它,如果必须这样做:
((*func)(*(func)test())()
标准并不能保证函数指针可以安全地转换为void*这只是证明它可以做到这一点的一种方式,尽管它不是一个好的实现。@詹姆斯·坎兹:我想我们已经解决了这个问题。旧的措辞基本上不允许使用
dlsym
/
GetProcAddress
,这被认为是合理的情况。IIRC这是第一次尝试“有条件支持的行为”@James Kanze:POSIX提供了不兼容的保证。在ISO C++98中,这是一个错误,需要诊断;在POSIX中,这是一个定义良好的行为。根据“有条件支持的行为”规则,它要么是实现定义的行为,要么是一个错误(需要诊断)。也就是说,POSIX实现可以参考POSIX标准;不可能的实现仍然必须给出错误。我们可以。使用函数对象。@iammilind:我想我可能已经明确提到可以使用函数对象了?
struct functor;
functor f();
struct functor
{
   functor operator()()
   {
      return f();
   }
};

functor f()
{  
    return functor();
}

int main()
{
    f()()()()();
}

#include <stdio.h>

typedef void * (*func)();

void * test()
{
    printf("this is test\n");
    return (void *)&test;
}

int main()
{
    (*(func)test())();
}

user@linux:~/work/test> gcc test_func.cc -o test          
user@linux:~/work/test> ./test
this is test
this is test