【发布时间】:2012-04-23 14:40:18
【问题描述】:
我有一些类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 中。
这里是sn-p的代码:
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 的范围对我来说似乎是自然而然的选择,我之所以怀疑只是因为我不记得我是否曾在代码或文献中遇到过它。
-
你能在 C++11 中使用
decltype吗? -
@PeterWood 我仅限于 C++03,但感谢您的建议。我不知道这个新功能,只是简单地看了一下它的描述。这在 C++11 中是否正确(并且足够)?
Functor1<C, decltype(&C::foo1),...> f1(&c, &C1::foo1,...);