C++重载方法指针

Nei*_*l G 26 c++

如何获取指向方法的特定重载的方法指针:

struct A {
    void f();
    void f(int);
    void g();
};
Run Code Online (Sandbox Code Playgroud)

我知道

&A::g
Run Code Online (Sandbox Code Playgroud)

是一个指针g.但是如何获得指针ff(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)


ice*_*ime 9

您只需要转换结果&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)


Okt*_*ist 5

感谢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模板的代码在这里.