在函数体内的typedef是不好的编程习惯吗?
我有一些类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;
}
这是好。这是合法的和本地化的。
它比较好:它有时是必需的。把'typedef'想象成一种“类型变量赋值”。 – 2012-04-11 09:49:14
恕我直言,如果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
这只是罚款。 – Mat 2012-04-11 09:41:31
伙计们,谢谢你的回答。在这种情况下,缩小* typedef *的范围似乎是我自然的选择,而且我怀疑只是因为我不记得是否曾经在代码或文献中遇到过它。 – 2012-04-11 09:53:06
你可以在C++ 11中使用'decltype'吗? – 2012-04-11 11:06:33