这个typedef定义是什么意思?

9
我看过以下的代码(C++):
typedef n *(m)(const n*, const n*);

什么意思并如何使用?
我理解为:
typedef n (*myFunctP)(const n*, const n*);

但是与上面的typedef有什么区别呢?

(希望这不是重复的,没有找到类似的东西...)


6
这意味着你应该开枪打作者 ;-) - Ed Heal
3个回答

12

我向geordi请求帮我赢得声望:

<tomalak> << TYPE_DESC<m>; struct n {}; typedef n *(m)(const n*, const n*);
<geordi> function taking 2 pointers to constant ns and returning a pointer to a n

C类型声明语法非常可怕,特别是当你开始进行像这样复杂的声明时,它变得尤为明显。请注意返回类型和参数是如何围绕着m而不是n编写的,这完全与直觉相反,因为你正在创建m

你的第二个例子是:

<tomalak> << TYPE_DESC<m>; struct n {}; typedef n (*m)(const n*, const n*);
<geordi> pointer to a function taking 2 pointers to constant ns and returning a n

通过移动*,您不再将其应用于函数类型的返回类型,而是应用于函数类型本身。

在C++11中,除非您迫切需要调用超级高效,否则请坚持遵循以下方式,献给克苏鲁之神的爱! :-)

typedef std::function<n*(const n*, const n*)> m;

如果您希望坚持使用函数指针,那么可以这样做:

using m = n*(const n*, const n*);

在那之前,您可以使用boost::function或学习可怕的C声明规则。确实,您应该了解它们;只是希望您不必太经常使用它们。


3
或者更好的写法:使用 m = n *(const n*,const n*); - Guilherme Bernal
1
@MattHolmes:仍然有必要理解并能够编写pre-function语法。并非每个人都使用C++11或Boost。 - John Dibling
1
std::function 是无开销的吗? - RedX
2
@MattHolmes:这并不简单。例如,随RHEL发行版一起提供的GCC版本非常旧,远在C++11之前。许多软件和客户端商店要求使用发行版提供的工具链。在假定所有不共享信仰的人都是“grognards”之前,请尝试看到更大的画面。 - John Dibling
我认为:typedef n* (m)(const n*, const n*);比起typedef n *(m)(const n*, const n*);更容易阅读。也许这就是困惑了OP的地方?无论如何,对于星号在n上还是括号上,我都感到迷失了。 - Brandon
显示剩余7条评论

5

第一个typedef为一个带有两个参数并返回指向n的指针的函数创建了一个别名。

第二个typedef为一个指向-带有两个参数并以值方式返回n的函数创建了一个别名。


1
无论 * 在括号内还是括号外都会有所不同。 - user743382
很奇怪,尽管你明显编辑了你的答案,但我无法撤销我的投票。SO仍然说除非这个答案被编辑,否则我的投票将被锁定。 - user743382
@hvd:可能是SE平台的某种错误,与我在取消删除之前进行编辑有关。不用担心,声望并不重要。 - John Dibling
完成。我认为这可能是因为在发布答案后的前五分钟左右,编辑历史记录仍为空,而投票锁定依赖于编辑历史记录。 - user743382
@hvd:一定是这样。无论如何,我在编辑历史记录方面打开了一个元票据:http://meta.stackexchange.com/questions/215153/odd-behavior-in-edit-history-when-i-edited-my-deleted-answer - John Dibling
显示剩余3条评论

1
在第一种情况下,typedef 定义了一个函数类型的别名,该函数类型具有两个参数,类型为 const n *,返回类型为 n *
在第二种情况下,不是函数类型而是声明了一个返回类型为 n 的函数指针。
在第一种情况下,也可以写成例如:
typedef n * ( (m)(const n*, const n*) );

它相当于你的typedef。
至于用法,你可以将其用作函数声明。例如:
m MyFunc;

另一个例子。
struct A
{
   typedef int n;
   typedef n  ( Operation )( n, n ) const;
   Operation Add;
   Operation Subtract;
   Operation Division;
   Operation Multiply;
};

// and below the function definitions

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接