【问题标题】:Is typedef inside of a function body a bad programming practice?函数体内的 typedef 是一种不好的编程习惯吗?
【发布时间】:2012-04-23 14:40:18
【问题描述】:

我有一些类C 并想将其实例和方法的地址传递给测试函数Test_C_Foo1() 中的某个函子。 Functor 是一个模板类,我必须提供类方法的类型 (MEMFN1) 作为其模板参数之一。我必须在某处定义 MEMFN1 类型,但不想更改 C.h 并且不想用它污染全局命名空间。我决定尽可能将 typedef 本地化,所以把它放在一个测试函数中——在实际使用MEMFN1 的范围内。 在函数体内使用 typedef 是一种好习惯吗?

标准允许在函数体内使用 typedef,仅在以下特定情况下限制它:

typedef 说明符不应组合在 decl-specifier-seq 中 与除类型说明符之外的任何其他类型的说明符,并且它应 不能在参数声明的 decl-specifier-seq 中使用 (8.3.5) 也不在函数定义 (8.4) 的 decl-specifier-seq 中。

这里是sn-p的代码:

C.h:

...
#include <string>
...

class C
{
public:
    int foo1(const std::string&);       
};

ma​​in.cpp:

...
#include "C.h"
...

void Test_C_Foo1()
{
   typedef int(C::*MEMFN1)(const std::string&);

   C c;   
   Functor1<C, MEMFN1,...> f1(&c, &C1::foo1,...);
   ...
}

...

int main()
{
    Test_C_Foo1();
    return 0;
}

【问题讨论】:

  • 各位,谢谢你们的回答。在这种情况下,缩小 typedef 的范围对我来说似乎是自然而然的选择,我之所以怀疑只是因为我不记得我是否曾在代码或文献中遇到过它。
  • 你能在 C++11 中使用decltype 吗?
  • @PeterWood 我仅限于 C++03,但感谢您的建议。我不知道这个新功能,只是简单地看了一下它的描述。这在 C++11 中是否正确(并且足够)? Functor1&lt;C, decltype(&amp;C::foo1),...&gt; f1(&amp;c, &amp;C1::foo1,...);

标签: c++ typedef


【解决方案1】:

很好。它是合法的和本地化的。

【讨论】:

  • 这不仅是好的:它有时是必要的。将typedef 视为一种“类型变量赋值”。
【解决方案2】:

恕我直言,如果typedef 只是为了避免键入或使指向成员函数的指针不那么麻烦,如您的示例所示,那很好。

但是如果typedef 揭示了一些特定的概念,那么它应该在函数之外可见。

快速测试以检查它是typedef 的名称:

typedef int(C::*MEMFN1)(const std::string&); //OK: as local typedef, just an abbreviation

typedef int(C::*ACTION)(const std::string&); //Not so OK: Action is a new concept

【讨论】:

  • 你的意思是如果一个名字意味着什么,那么它应该是全局的?这是一个相当奇怪的观点。
  • @MikeSeymour - 嗯,这是一般准则。并不完全是全局的,但在它补充的其他概念旁边可见。例如,如果 ACTION 类型定义有意义,则应在 C 类旁边定义。
  • 为什么要投反对票,伙计们?每个人都冒犯了编程哲学,又一次? :) .. 那里甚至有一个恕我直言,这听起来值得在这里,..恕我直言 :))
猜你喜欢
  • 2018-09-26
  • 2019-02-01
  • 1970-01-01
  • 2018-12-01
  • 2017-10-11
  • 2015-02-18
  • 1970-01-01
  • 2014-04-01
相关资源
最近更新 更多