Advertisement
AlexNovoross87

Компилятор и пространства имен ADL

Feb 14th, 2025
161
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.17 KB | None | 0 0
  1. #include <iostream>
  2.  
  3. namespace geom{
  4. struct Point{
  5.     int x = 0;
  6.     int y = 0;
  7. };
  8.  
  9. std::ostream& operator<<(std::ostream& out, Point p) {
  10.     return out << '{' << p.x << ',' << p.y << '}';
  11. }
  12.  
  13. void Print(Point p) {
  14.     std::cout << p << std::endl;
  15. }
  16. } // namespace geom
  17.  
  18. int main() {
  19.     geom::Point p{3, 4};
  20.     // Вызываем функцию geom::Print, указывая её полное имя
  21.     geom::Print(p);
  22.    
  23.     // Компилятор нашёл функцию Print, несмотря на то, что мы не указали её полное имя,
  24.     // Так как параметр функции p имеет тип geom::Point,
  25.     // компилятор ищет функцию Print ещё и в пространстве имён geom.
  26.     Print(p);
  27.  
  28.     // Компилятор ищет подходящую операцию << в пространстве имён std и в пространстве имён geom
  29.     // и находит его в geom. Благодаря ADL мы выводим пользовательские типы так:
  30.     std::cout << p;
  31.     // а не так:
  32.     geom::operator<<(std::cout, p);
  33. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement