Давайте розглянемо цікаву конструкцію зі стандарту C++14, яка дозволяє повернути структуру, використовувану в одному тільки місці коду, але при цьому потрібно повернути об'єкт з ім'ям полями.
Подібна конструкція може служити заміною std::tuple. При цьому нам не потрібно буде оголошувати якісь додаткові структури, які ми не збираємося нікуди передавати, оскільки нам потрібно отримати тільки комплект даних, які вже будемо якимось чином використовувати відразу в місці повернення і не будемо передавати далі в тому ж вигляді.
Приклад зі звичайною функцією
- #include <iostream>
- #include <string>
- using namespace std;
- // Оголосимо функцію, яка буде повертати значення auto
- auto getHero()
- {
- // Сформуємо неіменованого структуру значення, що повертається
- struct
- {
- std::string name;
- std::string surname;
- int age;
- } result { "James", "Bond", 42 }; // Відразу ж инициализируем об'єкт структури
- return result; // Далі можна повернути отриману структуру, компілятор сам все зробить завдяки auto
- }
- int main()
- {
- // Повертаємо дане значення відразу в auto змінну
- auto hero = getHero();
- // І вже можемо використовувати даний об'єкт, при цьому він буде мати іменовані поля
- std::cout << hero.surname << "..." << hero.name << " " << hero.surname << " " << hero.age << std::endl;
- return 0;
- }
Приклад з лямбда функцією
Приклад з лямбда функцією мало чим відрізнятиметься в даному випадку від звичайної функції, просто буде інше місце оголошення.
- #include <iostream>
- #include <string>
- using namespace std;
- int main()
- {
- // Оголосимо функцію, яка буде повертати значення auto
- auto getHero = []()
- {
- // Сформуємо неіменованого структуру значення, що повертається
- struct
- {
- std::string name;
- std::string surname;
- int age;
- } result { "James", "Bond", 42 }; // Відразу ж инициализируем об'єкт структури
- return result; // Далі можна повернути отриману структуру, компілятор сам все зробить завдяки auto
- };
- // Повертаємо дане значення відразу в auto змінну
- auto hero = getHero();
- // І вже можемо використовувати даний об'єкт, при цьому він буде мати іменовані поля
- std::cout << hero.surname << "..." << hero.name << " " << hero.surname << " " << hero.age << std::endl;
- return 0;
- }