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. // Оголосимо функцію, яка буде повертати значення auto
  7. auto getHero()
  8. {
  9. // Сформуємо неіменованого структуру значення, що повертається
  10. struct
  11. {
  12. std::string name;
  13. std::string surname;
  14. int age;
  15. } result { "James", "Bond", 42 }; // Відразу ж инициализируем об'єкт структури
  16. return result; // Далі можна повернути отриману структуру, компілятор сам все зробить завдяки auto
  17. }
  18.  
  19. int main()
  20. {
  21. // Повертаємо дане значення відразу в auto змінну
  22. auto hero = getHero();
  23. // І вже можемо використовувати даний об'єкт, при цьому він буде мати іменовані поля
  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. // Оголосимо функцію, яка буде повертати значення auto
  9. auto getHero = []()
  10. {
  11. // Сформуємо неіменованого структуру значення, що повертається
  12. struct
  13. {
  14. std::string name;
  15. std::string surname;
  16. int age;
  17. } result { "James", "Bond", 42 }; // Відразу ж инициализируем об'єкт структури
  18. return result; // Далі можна повернути отриману структуру, компілятор сам все зробить завдяки auto
  19. };
  20.  
  21. // Повертаємо дане значення відразу в auto змінну
  22. auto hero = getHero();
  23. // І вже можемо використовувати даний об'єкт, при цьому він буде мати іменовані поля
  24. std::cout << hero.surname << "..." << hero.name << " " << hero.surname << " " << hero.age << std::endl;
  25. return 0;
  26. }
  27.  

Вам це подобається? Поділіться в соціальних мережах!

Коментарі

Only authorized users can post comments.
Please, Log in or Sign up
  • Останні коментарі
  • Evgenii Legotckoi
    16 квітня 2025 р. 17:08
    Благодарю за отзыв. И вам желаю всяческих успехов!
  • IscanderChe
    12 квітня 2025 р. 17:12
    Добрый день. Спасибо Вам за этот проект и отдельно за ответы на форуме, которые мне очень помогли в некоммерческих пет-проектах. Профессиональным программистом я так и не стал, но узнал мно…
  • AK
    01 квітня 2025 р. 11:41
    Добрый день. В данный момент работаю над проектом, где необходимо выводить звук из программы в определенное аудиоустройство (колонки, наушники, виртуальный кабель и т.д). Пишу на Qt5.12.12 поско…
  • Evgenii Legotckoi
    09 березня 2025 р. 21:02
    К сожалению, я этого подсказать не могу, поскольку у меня нет необходимости в обходе блокировок и т.д. Поэтому я и не задавался решением этой проблемы. Ну выглядит так, что вам действитель…
  • VP
    09 березня 2025 р. 16:14
    Здравствуйте! Я устанавливал Qt6 из исходников а также Qt Creator по отдельности. Все компоненты, связанные с разработкой для Android, установлены. Кроме одного... Когда пытаюсь скомпилиров…