将指针传递给静态方法

Posted

技术标签:

【中文标题】将指针传递给静态方法【英文标题】:Pass a pointer to a static method 【发布时间】:2013-12-02 18:08:00 【问题描述】:

为什么编译器将&Foo::foo 视为void (*)()。我希望它被视为void(Foo::*)(),因为它是Foo 的成员。

class Foo

    public:
        static void foo ( void )
;

void foo ( void(Foo::*)(void) )

int main()
   
    foo(&Foo::foo);  // error: cannot convert ‘void (*)()’ to ‘void (Foo::*)()’
    return 0;

【问题讨论】:

没有其他变体需要一个普通的函数成员,因为 this 指针被隐式传递给这个函数(这就是 Foo::* 的用途)。 @g-makulik 对不起,我无法理解你的意思。能详细点吗? 克里斯的回答非常清楚地指出了这一点,void(Foo::*)() 仅适用于(非静态成员)。另请注意,用于取消引用成员函数指针的 ->* 形成了它自己的运算符,它不能被覆盖。 【参考方案1】:

您将函数 foo 声明为 static

因此它不是 Foo 实例的成员函数。

此代码有效:

class Foo

public:
    static void foo ( void )
    void foo2() 
;

void foo ( void(*)(void) )
void fooMember ( void(Foo::*)(void) )

int main()
   
    foo(&Foo::foo);
    fooMember(&Foo::foo2); 
    return 0;

编辑:我更新了描述并添加了一段代码。

【讨论】:

这是相当误导 - 它仍然是一个(静态)成员。更准确地说,指向成员的指针仅用于非静态成员,它们只能通过对象访问。 考虑将 It is therefore no member function of Foo. 更改为 It is therefore not a member function of a Foo instance,因为它是 Foo 类的成员。 我发现委托的 C++ 语法相当混乱。传递函数的可访问名称是什么? void(*)(void) 只是类型对...?

以上是关于将指针传递给静态方法的主要内容,如果未能解决你的问题,请参考以下文章

提升 C++。将带有签名指针的成员函数指针传递给函数

通过引用将值类型变量传递给静态方法线程安全吗?

用指向实例中方法的指针替换参数中的静态函数指针

禁用复制构造函数和赋值运算符时将引用实例传递给静态方法

python中静态方法,实例方法,类方法

将指针传递给保证归零的内存