関数を指すポインタ関数のタイプは、その戻り値とパラメータリストによって決定されますが、関数は関数タイプを返すことはできません.int fce( const char*, ... );
int fc( const char* );
// point to fce
typedef int (*PFCE)( const char*, ... );
// point to fc
typedef int (*PFC)( const char* );
// Initialization
PFCE pfce = fce;
PFC pfc = fc;
// Invoke the functions
pfce();
pfc();
リロード関数を指すポインタは、2つの関数ポインタタイプの間でタイプ変換できません.適切な関数を見つけるには、厳密に一致する必要があります.void ff( const char* );
void ff( unsigned int );
// Error: No Match, not available parameter list
void (*pf)(int) = ff;
// Error: No Match, not available return type
double (*pf2)( const char* )) = ff;
クラスインスタンスメンバー関数を指すポインタクラスインスタンスメンバー関数を指すポインタは、パラメータタイプと個数、戻りタイプ、属するクラスタイプの3つの態様に一致する必要があります.class Screen
{
public:
int Add(int lhs, int rhs);
int Del( int lhs, int rhs );
void ShowNumber(int value);
};
typedef int (Screen::*OPE)( int, int);
typedef void (Screen::*SHOW)( int);
OPE ope = &Screen::Add;
SHOW show = &Screen::ShowNumber;
Screen scr;
// Invoke its own member
int value = scr.Add(10, 20);
scr.ShowNumber(value);
// Invoke the function point
value = (scr.*ope)(10, 20);
(scr.*show)(value);
クラス静的メンバー関数を指すポインタクラス静的メンバー関数を指すポインタは、通常のポインタに属します.class Screen
{
public:
static int Add(int lhs, int rhs);
};
typedef int (*OPE)(int, int);
OPE ope = &Screen::Add;
int value = ope(10, 20);