【问题标题】:What is the type of a function pointer data member?函数指针数据成员的类型是什么?
【发布时间】:2026-01-24 06:55:02
【问题描述】:

在下面的代码中,我有一个函数成员和一个作为函数指针的数据成员。对于在声明中或作为模板参数使用,指向函数成员f 的指针的类型是int (Test::*)(int);但是指向函数指针数据成员pf 的指针的类似类型是什么?

struct Test
{
    int f( int ) { return 0; };
    int (*pf)( int );
};

int main()
{
    using Fmem = int (Test::*)( int );
    Fmem   x = &Test::f;

    // using PFmem = ??;
    // PFmem  y = &Test::pf;
}

【问题讨论】:

  • autodecltype(&Test::pf) 避免使用复杂的语法。

标签: c++ function-pointers pointer-to-member


【解决方案1】:
using PFmem = int (*Test::*)( int );
//                        ^ a pointer ...
//                  ^^^^^^ to a member of Test ...
//                 ^ which is a pointer ...
//                          ^     ^ to a function ...
//                            ^^^ taking an int ...
//            ^^^ returning an int

您也可以尝试使用模板类型定义来解开语法(我不确定是否值得):

struct Test
{
    int f( int ) { return 0; };
    int (*pf)( int );
};

template<typename T>                using pointer_to           = T *;
template<class C, typename T>       using pointer_to_member_of = T C::*;
template<typename R, typename ...A> using function             = R (A ...);

int main()
{
    using Fmem = int (Test::*)( int );
    Fmem   x = &Test::f;

    using PFmem = int (*Test::*)( int );
    PFmem  y = &Test::pf;

    pointer_to_member_of<Test, function<int, int>>
        x1 = &Test::f;
    pointer_to_member_of<Test, pointer_to<function<int, int>>>
        y2 = &Test::pf;
}

【讨论】:

  • 我的困难在于模板参数位。我在设计问题的最小示例时也遇到了麻烦,因为用例有点晦涩(使用函数调度表调整 C 风格的 API)。
  • 原来模板化适配器函数的问题是我的一个盲点。都很好。非常感谢。
【解决方案2】:
struct Test
{
    int f( int ) { return 0; };
    int (*pf)( int );
};

int main()
{
    using Fmem = int (Test::*)( int );
    Fmem   x = &Test::f;

    using PFmem = int (* Test::*)( int );
    PFmem y = &Test::pf;
}

如果您有疑问,可以借助编译器错误消息推断类型:

using PFmem = int; // any type
PFmem y = &Test::pf;

上面的代码导致下面的错误信息:

prog.cpp:13:30: error: cannot convert ‘int (* Test::*)(int)’ to ‘int’ in assignment
     PFmem y = &Test::pf;

从这个错误消息中,我们现在知道所需的类型是int (* Test::*)(int)

【讨论】:

    最近更新 更多