Представим следующую задачу: у нас есть вектор каких-то сложных структур. Мы хотим его посортить.
Как делать?
- Написать кастомный компаратор
- Еще верней написать лямбду
- Но есть способ пооригинальней
- Бывает полезно при сортировках (например, сортируй точки по первой координате, затем по второй...)
#include <iostream>
struct S {
int x = 0;
void f(int val) { std::cout << "Called with value " << val << '\n'; }
};
int main() {
int S::*p1 = &S::x; // проектор
S s;
std::cout << s.*p1 << '\n';
void (S::*p2)(int) = &S::f; // указатель на метод
S s2;
(s2.*p2)(1);
}- Syntax for variable projectors:
<type> <class_name>::* <name> = &<class_name>::<field_name>
- Технически, просто содержит offset расположения поля относительно начала объекта в памяти
- Syntax for function pointers:
<type> (<class_name>::* <name>)(Arg1, Arg2, ...) = &<class_name>::<method_name>
- Вместо оператора
.*можно использовать->*, если работает с указателями на объект класса.*перегружать нельзя,->*- можно