如何在不使用类名作为范围的情况下获取类中成员函数的地址?

Posted

技术标签:

【中文标题】如何在不使用类名作为范围的情况下获取类中成员函数的地址?【英文标题】:How to get address of member function within the class without using class name for scope? 【发布时间】:2018-12-11 10:52:59 【问题描述】:

我想知道是否可以在不使用类名作为作用域的情况下获取类中成员函数的地址。

在下面的例子中,main里面是正常的获取地址的方式,但是在func2里面,有没有不使用类名的方式。要求这样的原因是,将来如果我更改班级名称,我不必去内部更改。 例如:

Class A

 void func1()
 
 
 void func2()
 
  /Address of func1/ = &func1; // something like this possible?
 

void main()

 /Address of func1/ = &A::func1;

【问题讨论】:

试过了吗?发生了什么?你遇到了什么问题(如果有的话)? 您需要这样做的目的是什么?你到底想做什么? &std::remove_reference_t<decltype(*this)>::func1。由于缺少this,因此似乎不值得,并且无法为static 函数编译。 将来如果你改变类名,你还必须修改其他代码(最明显的是:构造函数),你为什么认为你需要一些特殊的成员函数指针?只需在类定义中搜索和替换。我宁愿担心类定义之外的必要修改 @πάντα ῥεῖ 我在使用 boost 的信号和绑定时使用它。 【参考方案1】:

对于非static的成员函数,

&std::remove_reference_t<decltype(*this)>::func1

是一种方式。

对于static 函数,使用std::addressof

std::addressof(func1); 

这依赖于 A:: 是隐含的事实。

【讨论】:

【参考方案2】:

如果func1static 函数,则可以使用std::addressof 获取其地址。

class A

    public:
    static void func1()
    
    
    void func2()
    
        auto fptr = std::addressof(func1); 
    
;

注意:这不适用于非static 成员函数。

【讨论】:

@Downvoter,这是错的吗?虽然我很惊讶这会起作用(因为建议实现 std::addressof),但我没有确认就投了赞成票。 @Bathsheba:我检查过了。好像没问题。不知道为什么它被DVed。 coliru.stacked-crooked.com/a/4f8f69ca3527749b @Bathsheba:但使用addressof 不适用于非静态函数。编译失败并出现错误:invalid use of non-static member function 'void A::func1()' auto fptr = std::addressof(func1); 糟糕。回到我的盒子里。

以上是关于如何在不使用类名作为范围的情况下获取类中成员函数的地址?的主要内容,如果未能解决你的问题,请参考以下文章

如何在不复制的情况下从 N 维容器中获取可迭代范围?

在 C++ 中,如何在不使用 if 语句的情况下选择运行特定的成员函数?

Laravel 6 Backpack 4.0:如何在 FormRequest 类中获取当前页面 ID,或者我可以在不使用 FormRequest 类的情况下获得吗?

如何在不向下转换的情况下调用派生类的成员函数

是否可以在不使用成员函数的情况下实现 Q_PROPERTY READ/WRITE 访问器?

如何获取包中的所有类名? [复制]