Evgenii Legotckoi
21 августа 2019 г. 13:56

C++14 - неименованная структура в качестве auto значения возвращаемого функцией

Рассмотрим интересную конструкцию из стандарта C++14, которая позволяет вернуть структуру, используемую в одном месте кода, но при этом нужно вернуть объект с именованными полями.

Такая конструкция может служить заменой std::tuple. При этом нам не нужно будет объявлять какие-то дополнительные структуры, которые мы не собираемся никуда передавать, так как нам нужно получить только набор данных, которые мы как-то используем сразу на месте возврата и не будем передавать дальше в такая же форма.


Пример нормальной функции

  1. #include <iostream>
  2. #include <string>
  3.  
  4. using namespace std;
  5.  
  6. // Declare a function that will return auto
  7. auto getHero()
  8. {
  9. // We will form an unnamed structure of the return value
  10. struct
  11. {
  12. std::string name;
  13. std::string surname;
  14. int age;
  15. } result { "James", "Bond", 42 }; // Initially initialize the structure object
  16. return result; // Then you can return the resulting structure, the compiler will do everything thanks to auto
  17. }
  18.  
  19. int main()
  20. {
  21. // We return this value immediately to the auto variable
  22. auto hero = getHero();
  23. // And we can already use this object, while it will have named fields
  24. std::cout << hero.surname << "..." << hero.name << " " << hero.surname << " " << hero.age << std::endl;
  25. return 0;
  26. }
  27.  

Пример лямбда-функции

Пример с лямбда-функцией в этом случае мало чем будет отличаться от обычной функции, просто будет другое место для объявления.

  1. #include <iostream>
  2. #include <string>
  3.  
  4. using namespace std;
  5.  
  6. int main()
  7. {
  8. // Declare a lamda function that will return auto
  9. auto getHero = []()
  10. {
  11. // We will form an unnamed structure of the return value
  12. struct
  13. {
  14. std::string name;
  15. std::string surname;
  16. int age;
  17. } result { "James", "Bond", 42 }; // Initially initialize the structure object
  18. return result; // Then you can return the resulting structure, the compiler will do everything thanks to auto
  19. };
  20.  
  21. // We return this value immediately to the auto variable
  22. auto hero = getHero();
  23. // And we can already use this object, while it will have named fields
  24. std::cout << hero.surname << "..." << hero.name << " " << hero.surname << " " << hero.age << std::endl;
  25. return 0;
  26. }
  27.  

Вам это нравится? Поделитесь в социальных сетях!

Комментарии

Только авторизованные пользователи могут публиковать комментарии.
Пожалуйста, авторизуйтесь или зарегистрируйтесь