C++重载方法指针

C++重载方法指针

问题描述:

如何获得一个方法指针的方法的特定超载:C++重载方法指针

struct A { 
    void f(); 
    void f(int); 
    void g(); 
}; 

我知道

&A::g 

是指向g。但是,如何获得指向ff(int)的指针?

(void (A::*)()) &A::f 
(void (A::*)(int)) &A::f 

函数指针和成员函数指针有这个特性 - 重载可以通过结果分配或者转换来解决。

如果函数是静态的,那么你应该把他们当作普通的功能:

(void (*)()) &A::f; 
(void (*)(int)) &A::f; 

甚至

(void (*)()) A::f; 
(void (*)(int)) A::f; 
+0

谢谢!如果成员函数是静态的呢? (我得到错误:没有上下文类型信息的重载函数的地址) – 2010-12-06 08:54:47

+0

@Neil:看我的编辑 – 2010-12-06 08:57:45

你一定要投的&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 

感谢Stefan Pabst提出的以下想法:wh呃他在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); 
} 

实施underload模板的代码是here