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

时间:2012-09-19 15:49:23

标签: c++ types

我有以下课程:

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 个答案:

答案 0 :(得分:7)

如果您不确定,请使用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 :(得分:1)

  1. 您没有函数指针。你有指向成员函数的指针

  2. 你不是要求数组的类型;相反,你要求的是数组的底层类型

  3. 基础类型是:

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

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

答案 2 :(得分:0)

该类型称为Pointer-to-member

答案 3 :(得分:0)

您可以将数组声明为:

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

从声明反映使用中可以明显看出这一点;给定索引iconst DXStartupEncoder &引用encunsigned char *&引用c,您可以写:

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

产生void类型的值:

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