Skip to content

Latest commit

 

History

History
45 lines (34 loc) · 1.52 KB

File metadata and controls

45 lines (34 loc) · 1.52 KB

Представим следующую задачу: у нас есть вектор каких-то сложных структур. Мы хотим его посортить.

Как делать?

  • Написать кастомный компаратор
    • Еще верней написать лямбду
  • Но есть способ пооригинальней

Проекторы

  • Бывает полезно при сортировках (например, сортируй точки по первой координате, затем по второй...)
#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>
  • Вместо оператора .* можно использовать ->*, если работает с указателями на объект класса
    • .* перегружать нельзя, ->* - можно