C++重载方法指针
问题描述:
如何获得一个方法指针的方法的特定超载:C++重载方法指针
struct A {
void f();
void f(int);
void g();
};
我知道
&A::g
是指向g
。但是,如何获得指向f
或f(int)
的指针?
答
(void (A::*)()) &A::f
(void (A::*)(int)) &A::f
函数指针和成员函数指针有这个特性 - 重载可以通过结果分配或者转换来解决。
如果函数是静态的,那么你应该把他们当作普通的功能:
(void (*)()) &A::f;
(void (*)(int)) &A::f;
甚至
(void (*)()) A::f;
(void (*)(int)) A::f;
答
你一定要投的&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。
谢谢!如果成员函数是静态的呢? (我得到错误:没有上下文类型信息的重载函数的地址) – 2010-12-06 08:54:47
@Neil:看我的编辑 – 2010-12-06 08:57:45