c – typedef’ing函数*签名*(不是指针),以便它可以重用?

编辑:动机

假设我将Handler类定义

class Handler {
public:
  class Message { /*...*/ };
  typedef int (*Callback)(Message *msg);
  void registerCallback(int msgclass,Callback f);
};

客户可以做到

int f1(Handler::Message *msg)
{ /* handle message */ }

int f2(Handler::Message *msg)
{ /* handle message */ }

int main(){
  Handler h;
  h.registerCallback(1,f1);
  h.registerCallback(2,f2);
  // ....
}

编译器确实会检查f1和f2是否适合作为registerCallback的参数,但是,由客户端来正确定义f1和f2.由于我已经完成了typedefed Callback,我希望客户能够使用它.

结束编辑

我想做这样的事情:

typedef int arithmetic(int i,int j);

arithmetic sum
{
 return i+j;
}

arithmetic max
{
  return (i>j)? i:j;
}
// etc.

但是,两者都有

arithmetic sum
arithmetic sum()

不编译,也是这个

arithmetic sum(int i,int j)

这给了编译器错误

func.cpp:4: error: ‘sum’ declared as
function returning a function

我想要这个的原因是我想要一个Handler类,它为它接受的回调函数提供一个typedef,包括参数列表.

解决方法

首先,你没有输入一个签名.签名是标识单个功能的所有内容.它包含函数名称空间/类等.

你输入的是函数的类型.就像你在typedef int inttype中键入int类型一样,你可以键入定义函数的类型.

您可以使用typedef-name仅声明函数.

arithmetic max; // valid

但它不能用于定义函数.要定义函数,您需要按字面和手动提供参数列表.原因包括给出参数的名称(以及可能的其他更多技术原因.C 0x引入算术max {};这将获得特定的初始化含义).

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...