38

私はいくつかのクラスを持っていてC、そのインスタンスとメソッドのアドレスをテスト関数のいくつかのファンクターに渡したいと思っていますTest_C_Foo1()MEMFN1Functorはテンプレートクラスであり、そのテンプレートパラメータの1つとしてクラスメソッド()の型を指定する必要があります。MEMFN1タイプをどこかで定義する必要がありますが、変更C.hしたくないし、グローバル名前空間を汚染したくないです。typedefを可能な限りローカライズすることにしたので、MEMFN1実際に使用されるスコープ内のtest-function内に配置します。関数本体内でtypedefを使用することは良い習慣ですか?

Standardでは、関数本体内でtypedefを使用でき、次の特定の場合にのみ制限されます。

typedef指定子は、decl-specifier-seqで、type-specifierを除く他の種類の指定子と組み合わせてはならず、parameter-declaration(8.3.5)のdecl-specifier-seqで使用してはなりません。関数定義のdecl-specifier-seq(8.4)。

コードスニペットは次のとおりです。

Ch:

...
#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;
}
4

2 に答える 2

69

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

于 2012-04-11T09:46:33.950 に答える
0

IMHO、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
于 2012-04-11T09:48:36.647 に答える