Как мне получить указатель метода на конкретную перегрузку метода:
struct A {
void f();
void f(int);
void g();
};
Я знаю, что
&A::g
является указателем на g
. Но как мне получить указатель на f
или f(int)
?
Как мне получить указатель метода на конкретную перегрузку метода:
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
Спасибо Стефану Пабсту за следующую идею, которую он представил в пятиминутной молниеносной речи в ACCU 2015. Я расширил ее с помощью типов тегов, чтобы разрешить перегрузки с помощью их квалификатора и/или контрольного квалификатора, а также 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
, здесь.