web-dev-qa-db-ja.com

関数本体内のtypedefはプログラミングの悪い習慣ですか?

クラス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;
}
30
Bojan Komazec

良いです。それは合法でローカライズされています。

51
justin