есть ли применение для & func или class :: func в c ++? - PullRequest
2 голосов
/ 05 марта 2009

Это кажется противоречивым. Почему мы используем & Example :: func вместо Example :: func? есть ли применение для Example :: func или & exampleFunction? не похоже, что мы можем сделать ссылку на функцию, чтобы исключить Example :: func. и я не могу придумать, как использовать & exampleFunction, так как exampleFunction уже возвращает указатель.

#include <iostream>
class Example {
public:
    void func() { std::cout <<"print me\n"; }
};
void exampleFunction() { std::cout << "print me too\n"; }
typedef void (Example::*ExampleFunc_t)(); 
typedef void (*ExampleFunction_t)();
int main()
{
    Example e;
    ExampleFunc_t     f  = &Example::func;
    ExampleFunction_t f2 = exampleFunction;
    (e.*f)();
    f2();
    return 0;
} 

Ответы [ 2 ]

6 голосов
/ 05 марта 2009

Потому что так стандарт определяет указатели на функции.

На самом деле вы всегда должны использовать оператор адреса &, чтобы получить указатель на функцию, но для обычных функций и статических функций-членов в стандарте определено неявное преобразование из функции в указатель на функцию. 1004 *

Это не определено для (нестатической) функции-члена, поскольку вы не можете получить lvalue для нестатической функции-члена.

Из стандарта C ++:

4.3 Преобразование функции в указатель

  1. Значение l типа функции T может быть преобразовано в значение типа r «Указатель на T». Результатом является указатель на функцию.

со сноской 52:

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

Я думаю, что они предпочли бы только разрешать и функционировать по причинам согласованности, но что неявное преобразование является просто артефактом наследия C ...

1 голос
/ 05 марта 2009

Точка использует Функциональные указатели . Для очень грубого примера, предположим, что у вас есть класс, имеющий несколько переменных-членов, по которым вам может понадобиться отсортировать элементы массива этого типа класса, например:

struct CL {
    int x, y, z;
};

bool sort_by_x(const CL& obj1, const CL& obj2);
bool sort_by_y(const CL& obj1, const CL& obj2);
bool sort_by_z(const CL& obj1, const CL& obj2);

...

CL obj[100];
...
sort(obj, obj+100, sort_by_x);
...
sort(obj, obj+100, sort_by_y);
...
sort(obj, obj+100, sort_by_z);

Здесь std :: sort используется для сортировки массива объектов CL. Посмотрите на третий параметр, это имя функции. Функция std :: sort может взять указатель на функцию в третьем параметре и использовать эту функцию в качестве компаратора для сортировки массива. Нам решать, как определить функции sort_by_ *, чтобы std :: sort работал как положено.

...