2012-04-11 50 views
27

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

标准允许使用的typedef在函数体内,限制它只能在这些特殊情况下:

的类型定义符不得在DECL说明符-SEQ 与任何其他种类的结合除了类型说明符以外,不应在参数声明 (8.3.5)的decl-specifier-seq中使用,也不应在函数定义(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; 
} 
+1

这只是罚款。 – Mat 2012-04-11 09:41:31

+0

伙计们,谢谢你的回答。在这种情况下,缩小* typedef *的范围似乎是我自然的选择,而且我怀疑只是因为我不记得是否曾经在代码或文献中遇到过它。 – 2012-04-11 09:53:06

+0

你可以在C++ 11中使用'decltype'吗? – 2012-04-11 11:06:33

回答

45

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

+6

它比较好:它有时是必需的。把'typedef'想象成一种“类型变量赋值”。 – 2012-04-11 09:49:14

-4

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

你是说如果一个名字意味着什么,那么它应该是全球性的?这是一个很奇怪的观点。 – 2012-04-11 10:26:19

+1

@MikeSeymour - 好的,这是一个通用的指导原则。确切地说,不是全球性的,而是与其他概念相辅相成。例如,如果'ACTION' typedef有意义,它应该在'C'类旁边定义。 – rodrigo 2012-04-11 10:32:51

+1

为什么downvote这个,chaps?再次,每个人都对编程哲学感到不满? :) ..那里甚至有一个恕我直言,这听起来值得在这里,..IMHO :)) – mlvljr 2017-03-08 20:07:54