38

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

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

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

这是代码片段:

频道:

...
#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;
}
4

2 回答 2

69

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

于 2012-04-11T09:46:33.950 回答
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
于 2012-04-11T09:48:36.647 回答