Давайте розглянемо цікаву конструкцію зі стандарту 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; }