函数体内的typedef是一个糟糕的编程习惯吗?

时间:2012-04-11 09:40:02

标签: c++ typedef

我有一些类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。

以下是代码段:

C.h:

...
#include <string>
...

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

main.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;
}

2 个答案:

答案 0 :(得分:51)

。这是合法的和本地化的。

答案 1 :(得分:-3)

恕我直言,如果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