获取 const 方法的地址

Posted

技术标签:

【中文标题】获取 const 方法的地址【英文标题】:Get address of const method 【发布时间】:2020-08-10 10:42:14 【问题描述】:

我希望能够形成一个只知道类本身和方法名称的成员指针类型。不幸的是,我无法在我的类中使用 const 和非 const 方法变体。

示例代码sn-p:

struct A

    void method() 
    void method() const 
;

int main()

    decltype(&A::method) _;

我也尝试过以下方法,但也没有太大成功:

decltype(&(std::declval<const A>().method)) _;

这两种方法都失败了,因为 decltype 由于模棱两可无法解决这个问题:

'decltype cannot resolve address of overloaded function'

我怎样才能以其他方式实现这一目标?

【问题讨论】:

没有两个这样的函数会因为签名不明确而产生问题吗? @possum 不,const 足以消除歧义。 【参考方案1】:

你可以这样做:

struct A

    void method() 
        cout << "Non const\n";    
    
    void method() const 
        cout << "const function\n";
    
;

int main()

    typedef  void (A::*method_const)() const;
    method_const a = &A::method;     //address of const method
    
    typedef  void (A::*method_nonconst)();
    method_nonconst b = &A::method;  //address of non const method
    
    A var;
    std::invoke(a, var);
    std::invoke(b, var);

如果你想使用decltype()来实现同样的功能,你首先要手动选择你想要使用static_cast&lt;&gt;的功能:

int main()

    //const
    decltype( static_cast <void (A::*)() const> (&A::method) ) a;
    //non const
    decltype( static_cast <void (A::*)()> (&A::method) ) b;
    
    a = &A::method;
    b = &A::method;
    
    A var;
    std::invoke(a, var);
    std::invoke(b, var);

Live on Coliru

【讨论】:

以上是关于获取 const 方法的地址的主要内容,如果未能解决你的问题,请参考以下文章

基于范围的循环:按值获取项目或引用 const?

Android在服务中使用Geocoder获取位置地址

13.4 获取蓝牙设备信息

指针和const的组合

CString类常用方法----Left(),Mid(),Right()

CString类常用方法----Left(),Mid(),Right()