【问题标题】:What does this typedef definition mean?这个 typedef 定义是什么意思?
【发布时间】:2014-01-24 05:57:53
【问题描述】:

我见过以下(C++):

typedef n *(m)(const n*, const n*);

这是什么意思,如何使用?

我明白了:

typedef n (*myFunctP)(const n*, const n*);

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

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

【问题讨论】:

  • 这意味着你应该拍摄作者;-)

标签: c++ typedef


【解决方案1】:

我要求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 中,除非您迫切需要超高效的调用,否则请坚持以下内容,看在 Cthulhu 的爱上! :-)

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

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

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

在此之前,您可以使用 boost::function 或学习可怕的 C 声明符规则。确实,您应该了解它们;只是希望您不会不得不过于频繁地使用它们。

【讨论】:

  • 我 100% 同意你的结论。 C++ 世界中的人们确实需要开始使用 std::function 来表达函数指针。忽略(非常过时的)谷歌风格指南并使用 std::function,为了触手怪物神的爱!
  • 或更好:using m = n*(const n*, const n*);
  • @MattHolmes:仍然需要理解并能够编写pre-function的语法。不是每个人都使用 C++11 或 Boost。
  • std::function 开销免费吗?
  • @MattHolmes:没那么简单。例如,考虑到 RHEL 发行版附带的 GCC 版本相当旧,远远早于 C++11。许多软件和客户端商店要求使用随发行版提供的工具链。在假设所有不同意您的信仰的人都是“grognards”之前,请尝试看大局。
【解决方案2】:

第一个 typedef 为接受 2 个参数并返回指向n 的指针的函数创建别名。

第二个 typedef 为 pointer-to- 函数创建一个别名,该函数接受 2 个参数并返回 n按值

【讨论】:

  • * 是在括号内还是在括号外会有所不同。
  • @hvd:糟糕,没有注意到* 在括号之外。
  • @hvd:已修复且未删除。
  • 奇怪的是,我无法撤消我的投票,即使您明确编辑了您的答案。所以仍然说我的投票被锁定,除非这个答案被编辑。
  • @hvd:SE 平台可能存在某种错误,这与我在取消删除之前进行了编辑有关。别担心;代表没什么大不了的。
【解决方案3】:

在第一种情况下,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

【讨论】:

    猜你喜欢
    • 2014-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-16
    相关资源
    最近更新 更多