Подтвердить что ты не робот

Перегруженный указатель метода С++

Как мне получить указатель метода на конкретную перегрузку метода:

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

Я знаю, что

&A::g

является указателем на g. Но как мне получить указатель на f или f(int)?

4b9b3361

Ответ 1

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

указатели функций и указатели функций-членов имеют эту функцию - перегрузка может быть решена с помощью того, какой результат был назначен или отличен.

Если функции статичны, вы должны рассматривать их как обычные функции:

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

или даже

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

Ответ 2

Вам просто нужно направить результат &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

Ответ 3

Спасибо Стефану Пабсту за следующую идею, которую он представил в пятиминутной молниеносной речи в 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, здесь.