1

私は次のクラスを持っています:

class DXStartupEncoder {
public:
   void EncodeA(unsigned char*& message) const;
   void EncodeB(unsigned char*& message) const;
   void EncodeC(unsigned char*& message) const;
   void EncodeD(unsigned char*& message) const;
};

<type> dn_sequence[] = {&DXStartupEncoder::EncodeA, &DXStartupEncoder::EncodeB, &DXStartupEncoder::EncodeC, &DXStartupEncoder::EncodeD };

しかし、この関数ポインタの配列の型は何でしょう?

4

4 に答える 4

7

typedefよくわからない場合はa を使用してください。

typedef void (DXStartupEncoder::*Encoder)(unsigned char*&) const;
Encoder dn_sequence[] = { .... };

C++11 ではdecltype、値から型を推測するために使用できるため、メンバー関数ポインターの型を記述する方法を知る必要さえありません (auto右側が initializer_list であるため、機能しません)。

decltype(&DXStartupEncoder::EncodeA) dn_sequence[] = { ... };

ちなみに、を避ける必要がある場合はtypedef、次のように記述します。

void (DXStartupEncoder::*dn_sequence[])(unsigned char*&) const = { ... };
于 2012-09-19T15:51:39.493 に答える
1
  1. 関数ポインタがありません。pointers-to-member-function があります。

  2. 配列の型を求めているわけではありません。むしろ、配列の基になる型を求めています。

  3. 基になる型は次のとおりです。

    void (DXStartupEncoder::*)(unsigned char * &)
    
  4. したがって、(不完全な) 配列型は次のようになります。

    void (DXStartupEncoder::*[])(unsigned char * &)
    
于 2012-09-19T15:52:54.813 に答える
0

配列は次のように宣言できます。

void (DXStartupEncoder::*dn_sequence[])(unsigned char *&) const = {...};

これは、declaration-reflects-useから明らかです。インデックスiconst DXStartupEncoder &参照enc、およびunsigned char *&参照が与えられたc場合、次のように記述します。

(enc.*dn_sequence[i])(c)

タイプの値を生成しますvoid

     (enc             .* dn_sequence[i])(c               )
void (DXStartupEncoder::*dn_sequence[] )(unsigned char *&) const
于 2012-09-19T16:04:34.180 に答える
0

この型はPointer-to-memberと呼ばれます。

于 2012-09-19T15:53:14.967 に答える