如何获取指向方法的特定重载的方法指针:
struct A {
void f();
void f(int);
void g();
};
Run Code Online (Sandbox Code Playgroud)
我知道
&A::g
Run Code Online (Sandbox Code Playgroud)
是一个指针g.但是如何获得指针f或f(int)?
Arm*_*yan 34
(void (A::*)()) &A::f
(void (A::*)(int)) &A::f
Run Code Online (Sandbox Code Playgroud)
函数指针和成员函数指针具有此功能 - 可以通过分配或转换结果来解决重载.
如果函数是静态的,那么您应该将它们视为普通函数:
(void (*)()) &A::f;
(void (*)(int)) &A::f;
Run Code Online (Sandbox Code Playgroud)
甚至
(void (*)()) A::f;
(void (*)(int)) A::f;
Run Code Online (Sandbox Code Playgroud)
您只需要转换结果&A::f以消除歧义:
static_cast<void (A::*)()>(&A::f); // pointer to parameterless f
static_cast<void (A::*)(int)>(&A::f); // pointer to f which takes an int
Run Code Online (Sandbox Code Playgroud)
感谢Stefan Pabst提出以下想法,他在ACCU 2015的五分钟闪电演讲中提出了这个想法.我用标签类型扩展它以允许通过他们的cv限定符和/或引用限定符以及C++ 17变量来解决重载模板,以避免必须键入额外的括号,否则需要.
此解决方案的工作原理与基于强制转换的答案相同,但您可以避免重复函数的返回类型,或者在成员函数的情况下,重写函数所属的类的名称,如编译器能够推断出这些东西.
bool free_func(int, int) { return 42; }
char free_func(int, float) { return true; }
struct foo {
void mem_func(int) {}
void mem_func(int) const {}
void mem_func(long double) const {}
};
int main() {
auto f1 = underload<int, float>(free_func);
auto f2 = underload<long double>(&foo::mem_func);
auto f3 = underload<cv_none, int>(&foo::mem_func);
auto f4 = underload<cv_const, int>(&foo::mem_func);
}
Run Code Online (Sandbox Code Playgroud)
实现underload模板的代码在这里.
| 归档时间: |
|
| 查看次数: |
7592 次 |
| 最近记录: |