LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
123
返回列表 发新帖
楼主: 月魄孤魂

能实现( f() )() 吗?

[复制链接]
 楼主| 发表于 2009-5-4 21:19:25 | 显示全部楼层
当你把"f()();"改成"f()()();"就通不过编译了.就如我上面所说的
要实现它就必须要声明三个嵌套层次的函数指针
但好像是两个(?).
回复 支持 反对

使用道具 举报

发表于 2009-5-4 23:26:59 | 显示全部楼层
Post by 月魄孤魂;1983286
当你把"f()();"改成"f()()();"就通不过编译了.就如我上面所说的但好像是两个(?).


问题的解决关键在于返回值上,函数返回void *只是一个32位整数,虽然它指向一个函数入口,但编译器还没有那么智能。所以如果想连续调用下去就得返回一个函数地址,例如void * (*fun)()。不过这样做只能使f()()成立,f()()()则无法成立,因为返回值void * (*fun)()的返回值是void *,又回到了第一步,所以我们需要继续修改返回值void * (*fun)(),改成(void * (*fun1)())((*fun)()),则f()()()成立,但是f()()()()又不成立了,问题还是出在返回值void *上。不知道说明白没有,头是不是有点大了,呵呵。

这实际上是个背包问题,无论如何最终都得有一个人去接手,据我所知C/C++目前貌似还无法解决,包括BOOST库在内都只能使用这种笨办法来解决。

LZ还是用递归或者强制类型转换吧。
回复 支持 反对

使用道具 举报

发表于 2009-5-5 00:11:29 | 显示全部楼层
如果是C++的话,并且可以不使用函数指针的话
[php]
#include  <iostream>
#include  <vector>

struct test
{
    std::vector<int> m_v;
    test& operator()(int i)
    {
        m_v.push_back(i);
        return *this;
    }
};

int main(int argc, char *argv[])
{
    test a;
    a(1)(2)(3)(4);

    for( size_t i = 0 ; i < a.m_v.size() ; i++ )
    {
        std::cout << a.m_v << std::endl;
    }
   
    return 0;
}
[/php]
回复 支持 反对

使用道具 举报

发表于 2009-5-5 01:09:47 | 显示全部楼层
Post by zlbruce;1983367
如果是C++的话,并且可以不使用函数指针的话
[php]
#include  <iostream>
#include  <vector>

struct test
{
    std::vector<int> m_v;
    test& operator()(int i)
    {
        m_v.push_back(i);
        return *this;
    }
};

int main(int argc, char *argv[])
{
    test a;
    a(1)(2)(3)(4);

    for( size_t i = 0 ; i < a.m_v.size() ; i++ )
    {
        std::cout << a.m_v << std::endl;
    }
   
    return 0;
}
[/php]

LZ也没规定必须要用C和函数指针,只要能实现f()()()就成。
我的脑子太死板了,哈哈

只不过这个代码不是多态的,如要实现BOOST的成员函数指针还得用笨办法。。。
我觉得还得在模版上下手,再研究研究。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-5-6 19:45:13 | 显示全部楼层
Post by Kevin_Chou;1983377
LZ也没规定必须要用C和函数指针,只要能实现f()()()就成。
我的脑子太死板了,哈哈

只不过这个代码不是多态的,如要实现BOOST的成员函数指针还得用笨办法。。。
我觉得还得在模版上下手,再研究研究。
哪里,开始时我不是说要用指针函数和指针函数来实现的么!?

现在看来,是C语言的尾巴不够长,所以她自己咬不到自己的尾巴(函数指针返回不了它自己本身),所以为了解决此问题只好把尾巴加长一点,变成了“C++”,哈哈。侃一下。
回复 支持 反对

使用道具 举报

发表于 2009-5-27 13:31:37 | 显示全部楼层
想法怪的人不只我一个。
回复 支持 反对

使用道具 举报

发表于 2009-6-8 01:50:32 | 显示全部楼层
搞这么复杂干吗
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. typedef int (*ac)(void);
  4. int ax()
  5. {
  6.     int a = 1000;
  7.     return a;
  8. }
  9. ac abc()
  10. {
  11.     return ax;
  12. }
  13. int main(int argc, char* argv[])
  14. {
  15.     printf("%d\n", (abc())());
  16.         return 0;
  17. }
复制代码
回复 支持 反对

使用道具 举报

发表于 2009-6-13 02:50:57 | 显示全部楼层
好贴啊 不错啊 谢谢楼主分享 拉 (*^__^*) 嘻嘻……                        
   
     
      
   
   
  
     
      
------------------------------------------------------------
张柏芝模型制作在地面上,不生乔木,只生野草,疤痕修复这是我的罪过。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表