函数指针数组的类型是什么

What is the type of an array of function pointers?

本文关键字:类型 是什么 数组 指针 函数      更新时间:2023-10-16

我有以下类:

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 };

但是这个函数指针数组的类型是什么?

如果您不确定,请使用typedef

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 = { ... };
  1. 您没有函数指针。您有指向成员函数的指针

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

  3. 基础类型为:

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

    void (DXStartupEncoder::*[])(unsigned char * &)
    

该类型称为指针到成员。

您可以将数组声明为:

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

这从声明反射使用中很明显;给定一个索引i、一个const DXStartupEncoder &引用enc和一个unsigned char *&引用c,你会写:

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

生成类型 void 的值:

     (enc             .* dn_sequence[i])(c               )
void (DXStartupEncoder::*dn_sequence[] )(unsigned char *&) const