есть ли применение & amp; func или class :: func в c ++?
-
03-07-2019 - |
Вопрос
Это кажется противоречивым. Почему мы используем & amp; Example :: func вместо Example :: func? есть ли применение для Example :: func или & exampleFunction? не похоже, что мы можем сделать ссылку на функцию, чтобы исключить Example :: func. и я не могу придумать, как использовать & amp; 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;
}
Решение
Потому что именно так стандарт определяет указатели на функции. Р>
На самом деле вам всегда нужно использовать адресный оператор & amp;
, чтобы получить указатель на функцию, но для обычных функций и статических функций-членов неявное преобразование из функции в указатель на функцию имеет вид определено в стандарте.
Это не определено для (нестатической) функции-члена, потому что вы не можете получить lvalue для нестатической функции-члена.
Из стандарта C ++:
4.3 Преобразование функции в указатель
<Ол>Значение l типа функции T можно преобразовать в значение типа r & # 8220; указатель на T. & # 8221; Результатом является указатель на функцию. Ол>
со сноской 52:
Это преобразование никогда не применяется к нестатическим функциям-членам, потому что lvalue, который ссылается на нестатическую функцию-член, не может быть получен. Р>
Я думаю, что они скорее позволят & amp; функционировать только по соображениям согласованности, но что неявное преобразование является просто артефактом наследия C ...
Другие советы
Дело в том, что используются указатели функций . Для очень грубого примера, предположим, что у вас есть класс, имеющий несколько переменных-членов, по которым вам может понадобиться отсортировать элементы массива этого типа класса, например, так:
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 работал как положено.