我有以下课程:
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 };
但是这个函数指针数组的类型是什么?
答案 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)
您没有函数指针。你有指向成员函数的指针。
你不是要求数组的类型;相反,你要求的是数组的底层类型。
基础类型是:
void (DXStartupEncoder::*)(unsigned char * &)
因此,(不完整的)数组类型为:
void (DXStartupEncoder::*[])(unsigned char * &)
答案 2 :(得分:0)
该类型称为Pointer-to-member。
答案 3 :(得分:0)
您可以将数组声明为:
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