获取 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<>
的功能:
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 方法的地址的主要内容,如果未能解决你的问题,请参考以下文章