クラスC
があり、そのインスタンスとメソッドのアドレスをテスト関数Test_C_Foo1()
の関数に渡したい。 Functorはテンプレートクラスであり、そのテンプレートパラメータの1つとしてクラスメソッドのタイプ(MEMFN1
)を指定する必要があります。 MEMFN1
タイプをどこかに定義する必要がありますが、C.h
を変更したくないし、それでグローバル名前空間を汚染したくありません。 typedefを可能な限りローカライズすることにしたので、それをテスト関数内に配置します-MEMFN1
が実際に使用されるスコープ内に配置します。 関数本体内でtypedefを使用するのは良い習慣ですか?
標準では、関数本体内でtypedefを使用でき、次の特定の場合にのみ制限されます。
Typedef指定子は、decl-specifier-seqで、type-specifierを除く他の種類の指定子と組み合わせてはならず、parameter-declaration(8.3.5)のdecl-specifier-seqでも使用されません。関数定義のdecl-specifier-seq(8.4)。
コードスニペットは次のとおりです。
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;
}
良いです。それは合法でローカライズされています。