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. 你没有函数指针。您有指向成员函数的指针

  2. 您不是在询问数组的类型;相反,您要求的是数组的基础类型

  3. 底层类型是:

    void (DXStartupEncoder::*)(unsigned char * &)
    
  4. 因此,(不完整的)数组类型是:

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

该类型称为Pointer-to-member

于 2012-09-19T15:53:14.967 回答
0

您可以将数组声明为:

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

这从声明-反映-使用中很明显;给定一个 index i、一个const DXStartupEncoder &referenceenc和一个unsigned char *&reference 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 回答