函数体内部的 typedef 是一种糟糕的编程实践吗?

Is typedef inside of a function body a bad programming practice?

本文关键字:编程 一种 typedef 内部 函数体      更新时间:2023-10-16

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

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

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

下面是代码片段:

C.h:

...
#include <string>
...
class C
{
public:
    int foo1(const std::string&);       
};

主.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只是为了避免键入或使指向成员的指针函数不那么麻烦,如您的示例所示,那么没关系。

但是,如果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
相关文章: